131782Sdenise /********************************************************************
231782Sdenise  *
3*31821Sdenise  * @(#)put.c	1.2 (CWI) 87/07/10
4*31821Sdenise  *
531782Sdenise  * code to put a character
631782Sdenise  *
731782Sdenise  *******************************************************************/
831782Sdenise 
931782Sdenise #include "the.h"
1031782Sdenise 
1131782Sdenise extern struct	dev dev;
1231782Sdenise extern struct	Font *fontbase[];
1331782Sdenise extern int	output;
1431782Sdenise extern short	*pstab;
1531782Sdenise extern int	nfonts, smnt, nchtab;
1631782Sdenise extern char	*chname, *fitab[];
1731782Sdenise extern char	*widthtab[], *codetab[];
1831782Sdenise extern short	*chtab, *fonttab[];
1931782Sdenise extern struct	fontname fontname[];
2031782Sdenise extern int	size, font, hpos, vpos, lastw, maxv;
2131782Sdenise extern int	virtRES;
2231782Sdenise extern char	buffer[];
2331782Sdenise extern int	vorigin, pagelen;
2431782Sdenise extern int	debug, dbg;
2531782Sdenise 
2631782Sdenise 
2731782Sdenise 
2831782Sdenise 
2931782Sdenise /*
3031782Sdenise  * s is the name of a special character
3131782Sdenise  */
3231782Sdenise 
put1s(s)3331782Sdenise put1s(s)
3431782Sdenise char *s;
3531782Sdenise {
3631782Sdenise 	int i;
3731782Sdenise 
3831782Sdenise 	if (!output)
3931782Sdenise 		return;
4031782Sdenise 
4131782Sdenise 	DBGPRINT(2, ("%s ", s));
4231782Sdenise 
4331782Sdenise 	for (i = 0; i < nchtab; i++)
4431782Sdenise 		if (strcmp(&chname[chtab[i]], s) == 0)
4531782Sdenise 			break;
4631782Sdenise 
4731782Sdenise 	if (i < nchtab)
4831782Sdenise 		put1(i + 128);
4931782Sdenise }
5031782Sdenise 
5131782Sdenise 
5231782Sdenise /*
5331782Sdenise  *  output char c
5431782Sdenise  */
5531782Sdenise 
put1(c)5631782Sdenise put1(c)
5731782Sdenise int c;
5831782Sdenise {
5931782Sdenise 	char *pw;
6031782Sdenise 	register char *p;
6131782Sdenise 	register int i, k;
62*31821Sdenise 	int ofont, code;
6331782Sdenise 	short f;
6431782Sdenise 
6531782Sdenise 	if (!output)
6631782Sdenise 		return;
6731782Sdenise 
6831782Sdenise 	c -= 32;
6931782Sdenise 	if (c <= 0) {
7031782Sdenise 		DBGPRINT(0, ("non-exist 0%o\n", c+32));
7131782Sdenise 		lastw = (widthtab[font][0] * pstab[size] + dev.unitwidth/2)/dev.unitwidth;
7231782Sdenise 		return;
7331782Sdenise 	}
7431782Sdenise 	k = ofont = font;
75*31821Sdenise 
76*31821Sdenise 	/* try to find it on this font
77*31821Sdenise 	 */
7831782Sdenise 	i = fitab[font][c] & BMASK;
79*31821Sdenise 	if (i != 0) {
8031782Sdenise 		p = codetab[font];
8131782Sdenise 		pw = widthtab[font];
82*31821Sdenise 	}
83*31821Sdenise 	/* well, check special font
84*31821Sdenise 	 */
85*31821Sdenise 	else if ((smnt > 0) && ((i = fitab[smnt][c] & BMASK) != 0)) {
86*31821Sdenise 		k = smnt;
87*31821Sdenise 		p = codetab[k];
88*31821Sdenise 		pw = widthtab[k];
89*31821Sdenise 		setfont(k);
90*31821Sdenise 	}
91*31821Sdenise 	/* now just see if we can find something on another font.
92*31821Sdenise 	 */
93*31821Sdenise 	else {
94*31821Sdenise 		for (k=1; k <= nfonts; k++) {
95*31821Sdenise 			if ( k == smnt ) continue;
9631782Sdenise 			if ((i = fitab[k][c] & BMASK) != 0) {
9731782Sdenise 				p = codetab[k];
9831782Sdenise 				pw = widthtab[k];
9931782Sdenise 				setfont(k);
10031782Sdenise 				break;
10131782Sdenise 			}
102*31821Sdenise 		}
10331782Sdenise 	}
10431782Sdenise 	if (i == 0 || (code = p[i] & BMASK) == 0 || k > nfonts) {
10531782Sdenise #ifdef DEBUGABLE
10631782Sdenise 		if (dbg) {
10731782Sdenise 			if (isprint(c+32) && isascii(c+32))
10831782Sdenise 				fprintf(stderr,"not found %c\n", c+32);
10931782Sdenise 			else
11031782Sdenise 				fprintf(stderr,"not found \\(%s\n", &chname[chtab[c -128+32]]);
11131782Sdenise 		}
11231782Sdenise #endif DEBUGABLE
113*31821Sdenise 		lastw = (widthtab[font][0] * pstab[size] + dev.unitwidth/2)/dev.unitwidth;
11431782Sdenise 		return;
11531782Sdenise 	}
11631782Sdenise 	if (fontbase[k]->fonttab == 1){
11731782Sdenise 		f = fonttab[k][i];
11831782Sdenise 	}
11931782Sdenise 	else {
12031782Sdenise 		f = fontname[k].number;
12131782Sdenise 	}
12231782Sdenise #ifdef DEBUGABLE
12331782Sdenise 	if (dbg) {
12431782Sdenise 		if (isprint(c+32) && isascii(c+32)) { /* My God! */
12531782Sdenise 			fprintf(stderr,"%c %d %d\n", c+32, code, f);
12631782Sdenise 		}
12731782Sdenise 		else
12831782Sdenise 			fprintf(stderr,"\\(%s %d %d\n", &chname[chtab[c -128+32]], code, f);
12931782Sdenise 	}
13031782Sdenise #endif DEBUGABLE
13131782Sdenise 	/*
13231782Sdenise 	if(code == 0 || code > 0200) {
13331782Sdenise 		error(FATAL,"Illegal code 0%o found for char %03o\n", code, c+32);
13431782Sdenise 	}
13531782Sdenise 	*/
13631782Sdenise 	putcode(code, f);	/* character is < 254 */
13731782Sdenise 	if (font != ofont)	/* char on special font, reset	*/
13831782Sdenise 		setfont(ofont);
13931782Sdenise 	lastw = pw[i] & NMASK;
14031782Sdenise 
14131782Sdenise 	lastw = (lastw * pstab[size] + dev.unitwidth/2) / dev.unitwidth;
14231782Sdenise }
14331782Sdenise 
14431782Sdenise 
14531782Sdenise 
14631782Sdenise 
14731782Sdenise 
14831782Sdenise /*
14931782Sdenise  * Plot a dot at (x, y).
15031782Sdenise  *
15131782Sdenise  * x and y are *VIRTUAL* coordinates (a change from prev. versions).
15231782Sdenise  *
15331782Sdenise  * The physical mapping of the point should be in the range 0 <= x < RASTER_LENGTH,
15431782Sdenise  * vorigin <= y < vorigin + NLINES.  If the point will not fit on the buffer,
15531782Sdenise  * it is left out.  Things outside the x boundary are wrapped around the end.
15631782Sdenise  */
15731782Sdenise 
point(x,y)15831782Sdenise point(x, y)
15931782Sdenise register int x;
16031782Sdenise register int y;
16131782Sdenise {
16231782Sdenise     register char *ptr;
16331782Sdenise 
16431782Sdenise     x = PHYS(x);
16531782Sdenise     y = PHYS(y);
16631782Sdenise 
16731782Sdenise     ptr = buf0p + (y - vorigin) * BYTES_PER_LINE + (x >> 3);
16831782Sdenise 
16931782Sdenise     if (ptr > BUFBOTTOM || ptr < BUFTOP)	/* ignore if it's off buffer */
17031782Sdenise 	return;
17131782Sdenise 
17231782Sdenise     *ptr |= 1 << (7 - (x & 07));
17331782Sdenise     if (y > maxv) maxv = y;
17431782Sdenise }
175