1 /******************************************************************** 2 * 3 * @(#)put.c 1.2 (CWI) 87/07/10 4 * 5 * code to put a character 6 * 7 *******************************************************************/ 8 9 #include "the.h" 10 11 extern struct dev dev; 12 extern struct Font *fontbase[]; 13 extern int output; 14 extern short *pstab; 15 extern int nfonts, smnt, nchtab; 16 extern char *chname, *fitab[]; 17 extern char *widthtab[], *codetab[]; 18 extern short *chtab, *fonttab[]; 19 extern struct fontname fontname[]; 20 extern int size, font, hpos, vpos, lastw, maxv; 21 extern int virtRES; 22 extern char buffer[]; 23 extern int vorigin, pagelen; 24 extern int debug, dbg; 25 26 27 28 29 /* 30 * s is the name of a special character 31 */ 32 33 put1s(s) 34 char *s; 35 { 36 int i; 37 38 if (!output) 39 return; 40 41 DBGPRINT(2, ("%s ", s)); 42 43 for (i = 0; i < nchtab; i++) 44 if (strcmp(&chname[chtab[i]], s) == 0) 45 break; 46 47 if (i < nchtab) 48 put1(i + 128); 49 } 50 51 52 /* 53 * output char c 54 */ 55 56 put1(c) 57 int c; 58 { 59 char *pw; 60 register char *p; 61 register int i, k; 62 int ofont, code; 63 short f; 64 65 if (!output) 66 return; 67 68 c -= 32; 69 if (c <= 0) { 70 DBGPRINT(0, ("non-exist 0%o\n", c+32)); 71 lastw = (widthtab[font][0] * pstab[size] + dev.unitwidth/2)/dev.unitwidth; 72 return; 73 } 74 k = ofont = font; 75 76 /* try to find it on this font 77 */ 78 i = fitab[font][c] & BMASK; 79 if (i != 0) { 80 p = codetab[font]; 81 pw = widthtab[font]; 82 } 83 /* well, check special font 84 */ 85 else if ((smnt > 0) && ((i = fitab[smnt][c] & BMASK) != 0)) { 86 k = smnt; 87 p = codetab[k]; 88 pw = widthtab[k]; 89 setfont(k); 90 } 91 /* now just see if we can find something on another font. 92 */ 93 else { 94 for (k=1; k <= nfonts; k++) { 95 if ( k == smnt ) continue; 96 if ((i = fitab[k][c] & BMASK) != 0) { 97 p = codetab[k]; 98 pw = widthtab[k]; 99 setfont(k); 100 break; 101 } 102 } 103 } 104 if (i == 0 || (code = p[i] & BMASK) == 0 || k > nfonts) { 105 #ifdef DEBUGABLE 106 if (dbg) { 107 if (isprint(c+32) && isascii(c+32)) 108 fprintf(stderr,"not found %c\n", c+32); 109 else 110 fprintf(stderr,"not found \\(%s\n", &chname[chtab[c -128+32]]); 111 } 112 #endif DEBUGABLE 113 lastw = (widthtab[font][0] * pstab[size] + dev.unitwidth/2)/dev.unitwidth; 114 return; 115 } 116 if (fontbase[k]->fonttab == 1){ 117 f = fonttab[k][i]; 118 } 119 else { 120 f = fontname[k].number; 121 } 122 #ifdef DEBUGABLE 123 if (dbg) { 124 if (isprint(c+32) && isascii(c+32)) { /* My God! */ 125 fprintf(stderr,"%c %d %d\n", c+32, code, f); 126 } 127 else 128 fprintf(stderr,"\\(%s %d %d\n", &chname[chtab[c -128+32]], code, f); 129 } 130 #endif DEBUGABLE 131 /* 132 if(code == 0 || code > 0200) { 133 error(FATAL,"Illegal code 0%o found for char %03o\n", code, c+32); 134 } 135 */ 136 putcode(code, f); /* character is < 254 */ 137 if (font != ofont) /* char on special font, reset */ 138 setfont(ofont); 139 lastw = pw[i] & NMASK; 140 141 lastw = (lastw * pstab[size] + dev.unitwidth/2) / dev.unitwidth; 142 } 143 144 145 146 147 148 /* 149 * Plot a dot at (x, y). 150 * 151 * x and y are *VIRTUAL* coordinates (a change from prev. versions). 152 * 153 * The physical mapping of the point should be in the range 0 <= x < RASTER_LENGTH, 154 * vorigin <= y < vorigin + NLINES. If the point will not fit on the buffer, 155 * it is left out. Things outside the x boundary are wrapped around the end. 156 */ 157 158 point(x, y) 159 register int x; 160 register int y; 161 { 162 register char *ptr; 163 164 x = PHYS(x); 165 y = PHYS(y); 166 167 ptr = buf0p + (y - vorigin) * BYTES_PER_LINE + (x >> 3); 168 169 if (ptr > BUFBOTTOM || ptr < BUFTOP) /* ignore if it's off buffer */ 170 return; 171 172 *ptr |= 1 << (7 - (x & 07)); 173 if (y > maxv) maxv = y; 174 } 175