xref: /original-bsd/old/vfilters/vplotf/vplotf.c (revision 6a07ffb0)
1fff8c27bSdist /*
2fff8c27bSdist  * Copyright (c) 1983 Regents of the University of California.
33fcb57bbSbostic  * All rights reserved.
43fcb57bbSbostic  *
5*6a07ffb0Sbostic  * %sccs.include.redist.c%
6fff8c27bSdist  */
7fff8c27bSdist 
85cc33d24Ssam #ifndef lint
93fcb57bbSbostic char copyright[] =
103fcb57bbSbostic "@(#) Copyright (c) 1983 Regents of the University of California.\n\
113fcb57bbSbostic  All rights reserved.\n";
123fcb57bbSbostic #endif /* not lint */
133fcb57bbSbostic 
143fcb57bbSbostic #ifndef lint
15*6a07ffb0Sbostic static char sccsid[] = "@(#)vplotf.c	5.5 (Berkeley) 06/01/90";
163fcb57bbSbostic #endif /* not lint */
175cc33d24Ssam 
18e206bd40Sralph /*
19e206bd40Sralph  *  Lpd filter to read standard graphics input and produce a plot on the
20e206bd40Sralph  *  Varian or Versatec
21e206bd40Sralph  */
22e206bd40Sralph 
23e206bd40Sralph #include <stdio.h>
24e206bd40Sralph #include <vfont.h>
25e206bd40Sralph #include <sys/vcmd.h>
26e206bd40Sralph 
27e206bd40Sralph #define	mapx(x)	((DevRange*((x)-botx)/del)+centx)
28e206bd40Sralph #define	mapy(y)	((DevRange*(del-(y)+boty)/del)-centy)
29e206bd40Sralph #define SOLID -1
30e206bd40Sralph #define DOTTED 014
31e206bd40Sralph #define SHORTDASHED 034
32e206bd40Sralph #define DOTDASHED 054
33e206bd40Sralph #define LONGDASHED 074
34e206bd40Sralph 
352dfad300Sralph static char *Sid = "@(#)\t5/16/83";
36e206bd40Sralph 
37e206bd40Sralph int	linmod = SOLID;
38e206bd40Sralph int	done1;
39e206bd40Sralph char	chrtab[][16];
40e206bd40Sralph char	*obuf;
41e206bd40Sralph int	bufsize;
42e206bd40Sralph int	lastx;
43e206bd40Sralph int	lasty;
44e206bd40Sralph int	radius, startx, starty, endx, endy;
45e206bd40Sralph double	topx;
46e206bd40Sralph double	topy;
47e206bd40Sralph double	botx;
48e206bd40Sralph double	boty;
49e206bd40Sralph int	centx = 0;
50e206bd40Sralph int	centy = 0;
51e206bd40Sralph double	delx;
52e206bd40Sralph double	dely;
53e206bd40Sralph double	del;
54e206bd40Sralph 
55e206bd40Sralph int	warned = 0;	/* Indicates whether the warning message about
56e206bd40Sralph 			 * unimplemented routines has been printed */
57e206bd40Sralph 
58e206bd40Sralph int	plotmd[] = {VPLOT};
59e206bd40Sralph int	prtmd[]  = {VPRINT};
602dfad300Sralph int	varian;			/* 0 for versatec, 1 for varian. */
612dfad300Sralph int	BYTES_PER_LINE;		/* number of bytes per raster line. */
622dfad300Sralph int	PAGE_LINES;		/* number of raster lines per page. */
63e206bd40Sralph int	DevRange = 1536;	/* output array size (square) in pixels */
64e206bd40Sralph int	DevRange8 = 1536/8;	/* output array size in bytes */
65e206bd40Sralph int	lines;			/* number of raster lines printed */
66e206bd40Sralph char	zeros[880];		/* one raster line */
67e206bd40Sralph 
68e206bd40Sralph char	*name, *host, *acctfile;
69e206bd40Sralph 
702dfad300Sralph /* variables used to print from font file */
71e206bd40Sralph int	fontSet = 0;		/* Has the font file been read */
72e206bd40Sralph struct	header header;
73e206bd40Sralph struct	dispatch dispatch[256];
74e206bd40Sralph char	*bits;
752dfad300Sralph char	*fontFile = "/usr/lib/vfont/R.8";
76e206bd40Sralph 
main(argc,argv)77e206bd40Sralph main(argc, argv)
78e206bd40Sralph 	int argc;
79e206bd40Sralph 	char *argv[];
80e206bd40Sralph {
81e206bd40Sralph 	register char *cp, *arg;
82e206bd40Sralph 	register n, again;
83e206bd40Sralph 
84e206bd40Sralph 	while (--argc) {
85e206bd40Sralph 		if (**++argv == '-') {
86e206bd40Sralph 			switch (argv[0][1]) {
872dfad300Sralph 			case 'x':
882dfad300Sralph 				BYTES_PER_LINE = atoi(&argv[0][2]) / 8;
892dfad300Sralph 				if (varian = BYTES_PER_LINE == 264) {
902dfad300Sralph 					DevRange = 1536;
912dfad300Sralph 					DevRange8 = 1536/8;
922dfad300Sralph 				} else {
932dfad300Sralph 					DevRange = 2048;
942dfad300Sralph 					DevRange8 = 2048/8;
952dfad300Sralph 				}
962dfad300Sralph 				break;
972dfad300Sralph 
982dfad300Sralph 			case 'y':
992dfad300Sralph 				PAGE_LINES = atoi(&argv[0][2]);
1002dfad300Sralph 				break;
1012dfad300Sralph 
102e206bd40Sralph 			case 'n':
103e206bd40Sralph 				argc--;
104e206bd40Sralph 				name = *++argv;
105e206bd40Sralph 				break;
106e206bd40Sralph 
107e206bd40Sralph 			case 'h':
108e206bd40Sralph 				argc--;
109e206bd40Sralph 				host = *++argv;
110e206bd40Sralph 			}
111e206bd40Sralph 		} else
112e206bd40Sralph 			acctfile = *argv;
113e206bd40Sralph 	}
114e206bd40Sralph 
115e206bd40Sralph 	/* init constants for scaling */
116e206bd40Sralph 	topx = topy = DevRange;
117e206bd40Sralph 	botx = boty = 0;
118e206bd40Sralph 	delx = dely = del = DevRange;
119e206bd40Sralph 	centx = (DevRange - mapx(topx))/2;
120e206bd40Sralph 	centy = mapy(topy)/2;
121e206bd40Sralph 
122e206bd40Sralph 	if ((obuf = (char *) malloc(bufsize = DevRange * DevRange8)) == NULL) {
123e206bd40Sralph 		fprintf(stderr, "vplotf: ran out of memory\n");
124e206bd40Sralph 		exit(2);
125e206bd40Sralph 	}
126e206bd40Sralph 
127e206bd40Sralph 	do {
128e206bd40Sralph 		arg = &obuf[bufsize];
129e206bd40Sralph 		for (cp = obuf; cp < arg; )
130e206bd40Sralph 			*cp++ = 0;
131e206bd40Sralph 
132e206bd40Sralph 		again = getpict();
133e206bd40Sralph 
134e206bd40Sralph 		ioctl(1, VSETSTATE, plotmd);
1352dfad300Sralph 		n = BYTES_PER_LINE - DevRange8;
136e206bd40Sralph 		for (cp = obuf; cp < arg; cp += DevRange8) {
137e206bd40Sralph 			if (write(1, cp, DevRange8) != DevRange8)
138e206bd40Sralph 				exit(1);
139e206bd40Sralph 			if (n && write(1, zeros, n) != n)
140e206bd40Sralph 				exit(1);
141e206bd40Sralph 			lines++;
142e206bd40Sralph 		}
143e206bd40Sralph 		ioctl(1, VSETSTATE, prtmd);
144e206bd40Sralph 		if (varian)
145e206bd40Sralph 			write(1, "\f", 2);
146e206bd40Sralph 		else
147e206bd40Sralph 			write(1, "\n\n\n\n\n", 6);
148e206bd40Sralph 	} while (again);
149e206bd40Sralph 
150e206bd40Sralph 	account(name, host, *argv);
151e206bd40Sralph 	exit(0);
152e206bd40Sralph }
153e206bd40Sralph 
account(who,from,acctfile)154e206bd40Sralph account(who, from, acctfile)
155e206bd40Sralph 	char *who, *from, *acctfile;
156e206bd40Sralph {
157e206bd40Sralph 	register FILE *a;
158e206bd40Sralph 
159e206bd40Sralph 	if (who == NULL || acctfile == NULL)
160e206bd40Sralph 		return;
161e206bd40Sralph 	if (access(acctfile, 02) || (a = fopen(acctfile, "a")) == NULL)
162e206bd40Sralph 		return;
163e206bd40Sralph 	/*
164e206bd40Sralph 	 * Varian accounting is done by 8.5 inch pages;
165e206bd40Sralph 	 * Versatec accounting is by the (12 inch) foot.
166e206bd40Sralph 	 */
167a0148ddeSralph 	fprintf(a, "t%6.2f\t", (double)lines / (double)PAGE_LINES);
168e206bd40Sralph 	if (from != NULL)
169e206bd40Sralph 		fprintf(a, "%s:", from);
170e206bd40Sralph 	fprintf(a, "%s\n", who);
171e206bd40Sralph 	fclose(a);
172e206bd40Sralph }
173e206bd40Sralph 
getpict()174e206bd40Sralph getpict()
175e206bd40Sralph {
176e206bd40Sralph 	register x1, y1;
177e206bd40Sralph 
178e206bd40Sralph 	for (;;) switch (x1 = getc(stdin)) {
179e206bd40Sralph 
180e206bd40Sralph 	case '\n':
181e206bd40Sralph 		continue;
182e206bd40Sralph 
183e206bd40Sralph 	case 's':
184e206bd40Sralph 		botx = getinteger(stdin);
185e206bd40Sralph 		boty = getinteger(stdin);
186e206bd40Sralph 		topx = getinteger(stdin);
187e206bd40Sralph 		topy = getinteger(stdin);
188e206bd40Sralph 		delx = topx-botx;
189e206bd40Sralph 		dely = topy-boty;
190e206bd40Sralph 		if (dely/delx > 1536./2048.)
191e206bd40Sralph 			del = dely;
192e206bd40Sralph 		else
193e206bd40Sralph 			del = delx;
194e206bd40Sralph 		centx = 0;
195e206bd40Sralph 		centx = (DevRange - mapx(topx))/2;
196e206bd40Sralph 		centy = 0;
197e206bd40Sralph 		centy = mapy(topy) / 2;
198e206bd40Sralph 		continue;
199e206bd40Sralph 
200e206bd40Sralph 	case 'b':
201e206bd40Sralph 		x1 = getc(stdin);
202e206bd40Sralph 		continue;
203e206bd40Sralph 
204e206bd40Sralph 	case 'l':
205e206bd40Sralph 		done1 |= 01;
206e206bd40Sralph 		x1 = mapx(getinteger(stdin));
207e206bd40Sralph 		y1 = mapy(getinteger(stdin));
208e206bd40Sralph 		lastx = mapx(getinteger(stdin));
209e206bd40Sralph 		lasty = mapy(getinteger(stdin));
210e206bd40Sralph 		line(x1, y1, lastx, lasty);
211e206bd40Sralph 		continue;
212e206bd40Sralph 
213e206bd40Sralph 	case 'c':
214e206bd40Sralph 		x1 = mapx(getinteger(stdin));
215e206bd40Sralph 		y1 = mapy(getinteger(stdin));
216e206bd40Sralph 		radius = mapx(getinteger(stdin));
217e206bd40Sralph 		circle(x1, y1, radius);
218e206bd40Sralph 		continue;
219e206bd40Sralph 
220e206bd40Sralph 	case 'a':
221e206bd40Sralph 		x1 = mapx(getinteger(stdin));
222e206bd40Sralph 		y1 = mapy(getinteger(stdin));
223e206bd40Sralph 		startx = mapx(getinteger(stdin));
224e206bd40Sralph 		starty = mapy(getinteger(stdin));
225e206bd40Sralph 		endx = mapx(getinteger(stdin));
226e206bd40Sralph 		endy = mapy(getinteger(stdin));
227e206bd40Sralph 		if (!warned) {
228e206bd40Sralph 			fprintf(stderr,"Arcs are unimplemented\n");
229e206bd40Sralph 			warned++;
230e206bd40Sralph 		}
231e206bd40Sralph 		continue;
232e206bd40Sralph 
233e206bd40Sralph 	case 'm':
234e206bd40Sralph 		lastx = mapx(getinteger(stdin));
235e206bd40Sralph 		lasty = mapy(getinteger(stdin));
236e206bd40Sralph 		continue;
237e206bd40Sralph 
238e206bd40Sralph 	case 't':
239e206bd40Sralph 		lastx = lastx - 6;
240e206bd40Sralph 		lasty = lasty + 6;
241e206bd40Sralph 		done1 |= 01;
242e206bd40Sralph 		while ((x1 = getc(stdin)) != '\n')
243e206bd40Sralph 			plotch(x1);
244e206bd40Sralph 		continue;
245e206bd40Sralph 
246e206bd40Sralph 	case 'e':
247e206bd40Sralph 		if (done1)
248e206bd40Sralph 			return(1);
249e206bd40Sralph 		continue;
250e206bd40Sralph 
251e206bd40Sralph 	case 'p':
252e206bd40Sralph 		done1 |= 01;
253e206bd40Sralph 		lastx = mapx(getinteger(stdin));
254e206bd40Sralph 		lasty = mapy(getinteger(stdin));
255e206bd40Sralph 		point(lastx, lasty);
256e206bd40Sralph 		point(lastx+1, lasty);
257e206bd40Sralph 		point(lastx, lasty+1);
258e206bd40Sralph 		point(lastx+1, lasty+1);
259e206bd40Sralph 		continue;
260e206bd40Sralph 
261e206bd40Sralph 	case 'n':
262e206bd40Sralph 		done1 |= 01;
263e206bd40Sralph 		x1 = mapx(getinteger(stdin));
264e206bd40Sralph 		y1 = mapy(getinteger(stdin));
265e206bd40Sralph 		line(lastx, lasty, x1, y1);
266e206bd40Sralph 		lastx = x1;
267e206bd40Sralph 		lasty = y1;
268e206bd40Sralph 		continue;
269e206bd40Sralph 
270e206bd40Sralph 	case 'f':
271e206bd40Sralph 		getinteger(stdin);
272e206bd40Sralph 		getc(stdin);
273e206bd40Sralph 		switch (getc(stdin)) {
274e206bd40Sralph 		case 't':
275e206bd40Sralph 			linmod = DOTTED;
276e206bd40Sralph 			break;
277e206bd40Sralph 		default:
278e206bd40Sralph 		case 'i':
279e206bd40Sralph 			linmod = SOLID;
280e206bd40Sralph 			break;
281e206bd40Sralph 		case 'g':
282e206bd40Sralph 			linmod = LONGDASHED;
283e206bd40Sralph 			break;
284e206bd40Sralph 		case 'r':
285e206bd40Sralph 			linmod = SHORTDASHED;
286e206bd40Sralph 			break;
287e206bd40Sralph 		case 'd':
288e206bd40Sralph 			linmod = DOTDASHED;
289e206bd40Sralph 			break;
290e206bd40Sralph 		}
291e206bd40Sralph 		while ((x1 = getc(stdin)) != '\n')
292e206bd40Sralph 			if (x1 == EOF)
293e206bd40Sralph 				return(0);
294e206bd40Sralph 		continue;
295e206bd40Sralph 
296e206bd40Sralph 	case 'd':
297e206bd40Sralph 		getinteger(stdin);
298e206bd40Sralph 		getinteger(stdin);
299e206bd40Sralph 		getinteger(stdin);
300e206bd40Sralph 		x1 = getinteger(stdin);
301e206bd40Sralph 		while (--x1 >= 0)
302e206bd40Sralph 			getinteger(stdin);
303e206bd40Sralph 		continue;
304e206bd40Sralph 
305e206bd40Sralph 	case 0:		/* ignore null characters */
306e206bd40Sralph 		continue;
307e206bd40Sralph 
308e206bd40Sralph 	case 255:
309e206bd40Sralph 	case EOF:
310e206bd40Sralph 		return(0);
311e206bd40Sralph 
312e206bd40Sralph 	default:
313e206bd40Sralph 		fprintf(stderr, "Input format error %c(%o)\n",x1,x1);
314e206bd40Sralph 		exit(2);
315e206bd40Sralph 	}
316e206bd40Sralph }
317e206bd40Sralph 
plotch(ch)318e206bd40Sralph plotch(ch)
319e206bd40Sralph char ch;
320e206bd40Sralph {
321e206bd40Sralph 	register int i,j,k;
322e206bd40Sralph 	register char *ptr,c;
323e206bd40Sralph 	int nbytes;
324e206bd40Sralph 
325e206bd40Sralph 	if (!fontSet)
326e206bd40Sralph 		InitFont();	/* Read font if not already read */
327e206bd40Sralph 
328e206bd40Sralph 	ptr = bits + dispatch[ch].addr;
329e206bd40Sralph 
330e206bd40Sralph 	for (i = dispatch[ch].up; i > -dispatch[ch].down; --i) {
331e206bd40Sralph 		nbytes = (dispatch[ch].right + dispatch[ch].left + 7)/8;
332e206bd40Sralph 		for (j = 0; j < nbytes; j++) {
333e206bd40Sralph 			c = *ptr++;
334e206bd40Sralph 			for (k = 7; k >= 0; k--)
335e206bd40Sralph 				if ((c >> k) & 1)
336e206bd40Sralph 					point(lastx+7-k+j*8-dispatch[ch].left, lasty-i);
337e206bd40Sralph 		}
338e206bd40Sralph 	}
339e206bd40Sralph 	if (ch != ' ')
340e206bd40Sralph 		lastx += dispatch[ch].width;
341e206bd40Sralph 	else
342e206bd40Sralph 		lastx += dispatch['a'].width;
343e206bd40Sralph }
344e206bd40Sralph 
InitFont()345e206bd40Sralph InitFont()
346e206bd40Sralph {
347e206bd40Sralph 	char *s;
348e206bd40Sralph 	int fonts;
349e206bd40Sralph 	int i;
350e206bd40Sralph 
351e206bd40Sralph 	fontSet = 1;
352e206bd40Sralph 	/* Get the font file */
353e206bd40Sralph 	s = fontFile;
354e206bd40Sralph 	if ((fonts = open(s, 0)) == -1) {
355e206bd40Sralph 		perror(s);
356e206bd40Sralph 		fprintf(stderr, "Can't get font file");
357e206bd40Sralph 		exit(2);
358e206bd40Sralph 	}
359e206bd40Sralph 	/* Get the header and check magic number */
360e206bd40Sralph 	if (read(fonts, &header, sizeof(header)) != sizeof(header)) {
361e206bd40Sralph 		perror(s);
362e206bd40Sralph 		fprintf(stderr, "Bad read in font file");
363e206bd40Sralph 		exit(2);
364e206bd40Sralph 	}
365e206bd40Sralph 	if (header.magic != 0436) {
366e206bd40Sralph 		fprintf(stderr,"Bad magic numer in font file");
367e206bd40Sralph 		exit(2);
368e206bd40Sralph 	}
369e206bd40Sralph 	/* Get dispatches */
370e206bd40Sralph 	if (read(fonts, dispatch, sizeof(dispatch)) != sizeof(dispatch)) {
371e206bd40Sralph 		perror(s);
372e206bd40Sralph 		fprintf(stderr, "Bad read in font file");
373e206bd40Sralph 		exit(2);
374e206bd40Sralph 	}
375e206bd40Sralph 	/* Allocate space for bit map and read in bits */
376e206bd40Sralph 	bits = (char *) malloc(header.size);
377e206bd40Sralph 	if (read(fonts, bits, header.size) != header.size) {
378e206bd40Sralph 		perror(s);
379e206bd40Sralph 		fprintf(stderr,"Can't read bit map in font file");
380e206bd40Sralph 		exit(2);
381e206bd40Sralph 	}
382e206bd40Sralph 	/* Close font file */
383e206bd40Sralph 	if (close(fonts) != 0) {
384e206bd40Sralph 		perror(s);
385e206bd40Sralph 		fprintf(stderr,"Can't close font file");
386e206bd40Sralph 		exit(2);
387e206bd40Sralph 	}
388e206bd40Sralph }
389e206bd40Sralph 
line(x0,y0,x1,y1)390e206bd40Sralph line(x0, y0, x1, y1)
391e206bd40Sralph register x0, y0;
392e206bd40Sralph {
393e206bd40Sralph 	int dx, dy;
394e206bd40Sralph 	int xinc, yinc;
395e206bd40Sralph 	register res1;
396e206bd40Sralph 	int res2;
397e206bd40Sralph 	int slope;
398e206bd40Sralph 
399e206bd40Sralph 	xinc = 1;
400e206bd40Sralph 	yinc = 1;
401e206bd40Sralph 	if ((dx = x1-x0) < 0) {
402e206bd40Sralph 		xinc = -1;
403e206bd40Sralph 		dx = -dx;
404e206bd40Sralph 	}
405e206bd40Sralph 	if ((dy = y1-y0) < 0) {
406e206bd40Sralph 		yinc = -1;
407e206bd40Sralph 		dy = -dy;
408e206bd40Sralph 	}
409e206bd40Sralph 	slope = xinc*yinc;
410e206bd40Sralph 	res1 = 0;
411e206bd40Sralph 	res2 = 0;
412e206bd40Sralph 	if (dx >= dy) while (x0 != x1) {
413e206bd40Sralph 		if ((x0+slope*y0) & linmod)
414e206bd40Sralph 			point(x0, y0);
415e206bd40Sralph 		if (res1 > res2) {
416e206bd40Sralph 			res2 += dx - res1;
417e206bd40Sralph 			res1 = 0;
418e206bd40Sralph 			y0 += yinc;
419e206bd40Sralph 		}
420e206bd40Sralph 		res1 += dy;
421e206bd40Sralph 		x0 += xinc;
422e206bd40Sralph 	} else while (y0 != y1) {
423e206bd40Sralph 		if ((x0+slope*y0) & linmod)
424e206bd40Sralph 		point(x0, y0);
425e206bd40Sralph 		if (res1 > res2) {
426e206bd40Sralph 			res2 += dy - res1;
427e206bd40Sralph 			res1 = 0;
428e206bd40Sralph 			x0 += xinc;
429e206bd40Sralph 		}
430e206bd40Sralph 		res1 += dx;
431e206bd40Sralph 		y0 += yinc;
432e206bd40Sralph 	}
433e206bd40Sralph 	if ((x1+slope*y1) & linmod)
434e206bd40Sralph 		point(x1, y1);
435e206bd40Sralph }
436e206bd40Sralph 
43726e6daefSmckusick #define labs(a) ((a) >= 0 ? (a) : -(a))
438e206bd40Sralph 
circle(x,y,c)439e206bd40Sralph circle(x,y,c)
440e206bd40Sralph {
441e206bd40Sralph 	register dx, dy;
442e206bd40Sralph 	long ep;
443e206bd40Sralph 	int de;
444e206bd40Sralph 
445e206bd40Sralph 	dx = 0;
446e206bd40Sralph 	ep = 0;
447e206bd40Sralph 	for (dy=c; dy>=dx; dy--) {
448e206bd40Sralph 		for (;;) {
449e206bd40Sralph 			point(x+dx, y+dy);
450e206bd40Sralph 			point(x-dx, y+dy);
451e206bd40Sralph 			point(x+dx, y-dy);
452e206bd40Sralph 			point(x-dx, y-dy);
453e206bd40Sralph 			point(x+dy, y+dx);
454e206bd40Sralph 			point(x-dy, y+dx);
455e206bd40Sralph 			point(x+dy, y-dx);
456e206bd40Sralph 			point(x-dy, y-dx);
457e206bd40Sralph 			ep += 2*dx + 1;
458e206bd40Sralph 			de = -2*dy + 1;
459e206bd40Sralph 			dx++;
460e206bd40Sralph 			if (labs(ep) >= labs(ep+de)) {
461e206bd40Sralph 				ep += de;
462e206bd40Sralph 				break;
463e206bd40Sralph 			}
464e206bd40Sralph 		}
465e206bd40Sralph 	}
466e206bd40Sralph }
467e206bd40Sralph 
468e206bd40Sralph /*
469e206bd40Sralph  * Points should be in the range 0 <= x (or y) <= DevRange.
470e206bd40Sralph  * The origin is the top left-hand corner with increasing x towards the
471e206bd40Sralph  * right and increasing y going down.
472e206bd40Sralph  */
point(x,y)473e206bd40Sralph point(x, y)
474e206bd40Sralph register unsigned x, y;
475e206bd40Sralph {
476e206bd40Sralph 	register unsigned byte;
477e206bd40Sralph 
478e206bd40Sralph 	if (x < DevRange && y < DevRange) {
479e206bd40Sralph 		byte = y * DevRange8 + (x >> 3);
480e206bd40Sralph 		obuf[byte] |= 1 << (7 - (x & 07));
481e206bd40Sralph 	}
482e206bd40Sralph }
483e206bd40Sralph 
getinteger(f)484e206bd40Sralph getinteger(f)
485e206bd40Sralph FILE *f;
486e206bd40Sralph {
487e206bd40Sralph 	register int low, high, result;
488e206bd40Sralph 
489e206bd40Sralph 	low = getc(f);
490e206bd40Sralph 	high = getc(f);
491e206bd40Sralph 	result = ((high << 8) | low);
492e206bd40Sralph 	if (high > 127)
493e206bd40Sralph 		result |= ~0xffff;
494e206bd40Sralph 	return(result);
495e206bd40Sralph }
496