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