⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vplot.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 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 + -