Annotation of 41BSD/cmd/cifplot/fonts.c, revision 1.1

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/fonts.c                                         *
        !             4: *    Written by Dan Fitzpatrick                                    *
        !             5: *    copyright 1980 -- Regents of the University of California     *
        !             6: *                                                                  *
        !             7: ********************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <vfont.h>
        !            11: #include "defs.h"
        !            12: #include "globals.h"
        !            13: #include "structs.h"
        !            14: #include "out_structs.h"
        !            15: #include "alloc.h"
        !            16: 
        !            17: IMPORT char *Concat();
        !            18: IMPORT alloc();
        !            19: IMPORT Error();
        !            20: 
        !            21: FORWARD real TCompare();
        !            22: 
        !            23: struct header header;
        !            24: struct dispatch dispatch[256];
        !            25: char *bits;
        !            26: 
        !            27: char *fontfile = "R.6";
        !            28: 
        !            29: InitText()
        !            30: {
        !            31:     char *s;
        !            32:     int fonts;
        !            33:     int i;
        !            34: 
        !            35:     /* Get the font file */
        !            36:     s = Concat("/usr/lib/vfont/",fontfile,0);
        !            37:     if((fonts = open(s,0)) == -1) {
        !            38:        perror(s);
        !            39:        Error("Can't get font file",RUNTIME);
        !            40:        }
        !            41:     /* Get the header and check magic number */
        !            42:     if(read(fonts,&header,sizeof(header)) != sizeof(header)) {
        !            43:        perror(s);
        !            44:        Error("Bad read in font file",RUNTIME);
        !            45:        }
        !            46:     if(header.magic != 0436) {
        !            47:        Error("Bad magic numer in font file",RUNTIME);
        !            48:        }
        !            49:     /* Get dispatches */
        !            50:     if(read(fonts,dispatch,sizeof(dispatch)) != sizeof(dispatch)) {
        !            51:        perror(s);
        !            52:        Error("Bad read in font file",RUNTIME);
        !            53:        }
        !            54:     /* Allocate space for bit map and read in bits */
        !            55:     bits = (char *) alloc(header.size);
        !            56:     if(read(fonts,bits,header.size) != header.size) {
        !            57:        perror(s);
        !            58:        Error("Can't read bit map in font file",RUNTIME);
        !            59:        }
        !            60:     /* Close font file */
        !            61:     if(close(fonts) != 0) {
        !            62:        perror(s);
        !            63:        Error("Can't close font file",RUNTIME);
        !            64:        }
        !            65:     /* Find the possible range up and down in which the text fits */
        !            66:     TextUp = TextDown = 0;
        !            67:     for(i=0;i<256;i++) {
        !            68:        if(dispatch[i].nbytes && TextUp < dispatch[i].up)
        !            69:                TextUp = dispatch[i].up;
        !            70:        if(dispatch[i].nbytes && TextDown < dispatch[i].down)
        !            71:                TextDown = dispatch[i].down;
        !            72:        }
        !            73:     }
        !            74:     
        !            75: DrawText(s,i,ypos,xpos)
        !            76: char *s;
        !            77: int i,ypos,xpos;
        !            78: {
        !            79:     if(!text) return;
        !            80:     /* For all characters in string call DrawChar offset each character
        !            81:      * by the width of the previous one */
        !            82:     for(;*s;s++) {
        !            83:        ypos += DrawChar(*s,i,ypos,xpos);
        !            84:        }
        !            85:     }
        !            86: 
        !            87: int
        !            88: DrawChar(ch,i,ypos,xpos)
        !            89: char ch;
        !            90: int i,ypos,xpos;
        !            91: {
        !            92:     int nbytes,j;
        !            93:     char *addr;
        !            94: 
        !            95:     /* It white space return an offset */
        !            96:     if(ch == ' ' || ch == '\t' ) return((int) dispatch['t'].width);
        !            97: 
        !            98:     blank(ypos-1,ypos+1+dispatch[ch].width,xpos);
        !            99:     /* If the line lines in appropriate range fill in bits for character */
        !           100:     if(-dispatch[ch].down < i && i <= dispatch[ch].up) {
        !           101:         addr = bits+dispatch[ch].addr;
        !           102:         nbytes = (dispatch[ch].right + dispatch[ch].left + 7)/8;
        !           103:         addr += (dispatch[ch].up - i)*nbytes;
        !           104:         for(j=0; j<nbytes; j++) 
        !           105:            match(addr[j],j*8 - dispatch[ch].left + ypos,xpos);
        !           106:        }
        !           107:     return((int) dispatch[ch].width);
        !           108:     }
        !           109: 
        !           110: TextLength(s)
        !           111: char *s;
        !           112: {
        !           113:     int len;
        !           114:     len = 0;
        !           115:     for(;*s;s++) 
        !           116:        len += TextWidth(*s);
        !           117:     return(len);
        !           118:     }
        !           119: 
        !           120: TextWidth(ch)
        !           121: char ch;
        !           122: {
        !           123:     return( (ch == ' ' || ch == '\t') ? dispatch['t'].width : dispatch[ch].width);
        !           124:     }
        !           125: 
        !           126: ClipText(s,rx,ry,adjust)
        !           127: char *s;
        !           128: real rx,ry;
        !           129: char adjust;
        !           130: {
        !           131:     int x,y;
        !           132:     int len;
        !           133:     char *p;
        !           134:     TextStruct *t;
        !           135: 
        !           136:     if(!text) return;
        !           137:     switch(adjust) {
        !           138:        case 'l':
        !           139:                /* Left adjust */
        !           140:                x = CONVERT(rx);
        !           141:                y = CONVERT(ry);
        !           142:                break;
        !           143:        case 'c':
        !           144:        case 'C':
        !           145:                /* Center adjust */
        !           146:                x = CONVERT(rx) + TextUp/2;
        !           147:                y = CONVERT(ry) - TextLength(s)/2;
        !           148:                break;
        !           149:        case 'r':
        !           150:        case 'R':
        !           151:                /* Right adjust */
        !           152:                x = CONVERT(rx);
        !           153:                y = CONVERT(ry) - TextLength(s);
        !           154:                break;
        !           155:        case 'S':
        !           156:                /* Adjust for symbol name */
        !           157:                if(!printSymbolName) return;
        !           158:                x = CONVERT(rx) + TextUp + 7;
        !           159:                y = CONVERT(ry) + 5;
        !           160:                break;
        !           161:        case 'T':
        !           162:                /* Adjust for point name */
        !           163:                x = CONVERT(rx) + TextUp+1;
        !           164:                y = CONVERT(ry)+1;
        !           165:                break;
        !           166:        default:
        !           167:                Error("Unknown text adjustment in ClipText",INTERNAL);
        !           168:        }
        !           169:     for(;*s && y < 0;s++) y += TextWidth(*s);
        !           170:     len = y;
        !           171:     for(p = s; *p && len < NoPixcels; p++) len += TextWidth(*p);
        !           172:     *p = '\0';
        !           173:     if(*s == '\0') return;
        !           174:     t = GetTextStruct();
        !           175:     t->str = s;
        !           176:     t->xpos = x;       t->ypos = y;
        !           177:     PutList(t,&TextList,TCompare);
        !           178:     return;
        !           179:     }
        !           180: 
        !           181: /*
        !           182: testfont()
        !           183: {
        !           184:     int nbytes;
        !           185:     char ch;
        !           186:     char *addr;
        !           187:     int i;
        !           188:     int j;
        !           189: 
        !           190:     vopen();
        !           191:     for(i = 40; i > -20; i--) {
        !           192:        DrawText("abcDE2@q Now is the time for all good men to come to the aid ... !@#$%^&*()_+}{|~`':::;<>.,",i,13);
        !           193:        }
        !           194:     vclose();
        !           195:     }
        !           196: 
        !           197: display(i)
        !           198: int i;
        !           199: {
        !           200:     int k;
        !           201:     for(k=0;k<8;k++) {
        !           202:        if(i & 0x80) putchar('x');
        !           203:                else putchar(' ');
        !           204:        i = i << 1;
        !           205:        }
        !           206:     }
        !           207:     */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.