Annotation of 43BSDTahoe/new/X/libapollo/font.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid_font_c = "$Header: font.c,v 10.1 86/11/29 13:52:01 jg Rel $";
                      3: #endif lint
                      4:     /*
                      5: 
                      6:     Copyright 1986 by the University of Utah
                      7: 
                      8:     Permission to use, copy, modify, and distribute this
                      9:     software and its documentation for any purpose and without
                     10:     fee is hereby granted, provided that the above copyright
                     11:     notice appear in all copies and that both that copyright
                     12:     notice and this permission notice appear in supporting
                     13:     documentation, and that the name of the University of Utah
                     14:     not be used in advertising or publicity pertaining to 
                     15:     distribution of the software without specific, written 
                     16:     prior permission. The University of Utah makes no
                     17:     representations about the suitability of this software for
                     18:     any purpose.  It is provided "as is" without express or
                     19:     implied warranty.
                     20: 
                     21:     */
                     22: 
                     23: /* font.c      Reads a font from a file and stores it on the workstation
                     24:  *
                     25:  *     GetFont         Takes a font name and stores it
                     26:  *     FreeFont        Frees the storage taken by a font
                     27:  *
                     28:  */
                     29: 
                     30: /*
                     31:  *     ToDo:
                     32:  *             Use Sun fonts too
                     33:  */
                     34: 
                     35: #include "Xapollo.h"
                     36: #include "vssite.h"
                     37: #include "../libvs100/param.h"
                     38: #include <errno.h>
                     39: #include <sys/file.h>
                     40: 
                     41: extern int errno;
                     42: extern int borrow_flag;
                     43: 
                     44: char *Xalloc(), *strcpy(), *strcat();
                     45: long lseek();
                     46: 
                     47: #define CHARPERFONT 256
                     48: 
                     49: static short ReverseBitsInByte[256] = {
                     50: 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
                     51: 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
                     52: 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
                     53: 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
                     54: 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
                     55: 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
                     56: 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
                     57: 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
                     58: 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
                     59: 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
                     60: 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
                     61: 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
                     62: 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
                     63: 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
                     64: 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
                     65: 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
                     66: };
                     67: 
                     68: #define ReverseBitsInShort(s) ((ReverseBitsInByte[(s)&0xff]<<8)|ReverseBitsInByte[((s)>>8)&0xff])
                     69: 
                     70: 
                     71: FONT *GetFont (name)
                     72:        char *name;
                     73: {
                     74:        char fontname[256];
                     75:        int fontfile = -1;
                     76:        FontData font;
                     77: #define chars ((BitMap *) font.f_characters)
                     78:        int fontsize, leftsize, width, i, j;
                     79:        char *fontarea;
                     80:        register short *leftarea, *leftarray;
                     81:        register FONT *fd;
                     82:        register FontPriv *fpriv;
                     83:        int tablesize = (CHARPERFONT + 1) * sizeof(short);
                     84:        extern char *getenv(), *index();
                     85:        static char *Fontpath = NULL;
                     86:        char *fontpath;
                     87:        char lname[64];
                     88:        int namelen;
                     89: 
                     90:        strcpy( lname, DEFAULT_APOLLO_FONT_PATH);
                     91:        strcat( lname, name );
                     92:        fontfile = access (lname, F_OK);
                     93:        if (fontfile == 0) {
                     94:          short fid;
                     95:          gpr_$offset_t size;
                     96:          status_$t status;
                     97: 
                     98:          fd = (FONT *) Xalloc (sizeof (FONT));
                     99: 
                    100:          fd->name = (char *) Xalloc (strlen (name) + 1);
                    101:          strcpy (fd->name, name);
                    102: 
                    103:          fpriv = (FontPriv *) Xalloc (sizeof (FontPriv));
                    104: 
                    105:          fd->fixed = 1;
                    106:          fd->data = (caddr_t) fpriv;
                    107: 
                    108:          fpriv->widths = NULL;
                    109:          fpriv->leftarray = NULL;
                    110: 
                    111:          namelen = strlen(lname);
                    112:          gpr_$load_font_file(*lname, (short)namelen, (short)fid, status);
                    113:          check_status(status, "Getfont");   
                    114:          gpr_$set_text_font( fid, status);
                    115:          gpr_$inq_text_extent("W", 1, size, status);
                    116:          fd->height = size.y_size;
                    117:          fd->avg_width = size.x_size;
                    118:          fpriv->maxwidth = size.x_size;
                    119: 
                    120:          fd->first = '\0';
                    121:          fd->last = '\177';
                    122:          fd->base = 0;
                    123:          fd->space = 0;
                    124:          fd->refcnt = 1;
                    125:          fpriv->ap_font_id = fid;
                    126:          fpriv->ap_font = true;
                    127: /*  Now load inverse version of font
                    128:  */
                    129:          strcat(lname, ".i");
                    130:          namelen = strlen(lname);
                    131:          gpr_$load_font_file(*lname, (short)namelen, (short)fid, status);
                    132:          check_status(status, "GetFont: ");   
                    133:          fpriv->ap_font_id_inv = fid;
                    134:       if (!borrow_flag) {
                    135:        fpriv->ap_font_id_inv = fpriv->ap_font_id;
                    136:         fpriv->ap_font_id = fid;
                    137:         }
                    138:        }            
                    139:        else {
                    140:          if (!Fontpath) {
                    141:            char *temp = getenv("XFONTPATH");
                    142: 
                    143:            if (temp) {
                    144:              Fontpath = Xalloc(strlen(temp) + 1);
                    145:              strcpy(Fontpath, temp);
                    146:            }
                    147:          }
                    148:        
                    149:          if ((fontpath = Fontpath) == NULL)
                    150:            fontpath = DEFAULT_FONT_PATH;
                    151: 
                    152:          fontfile = open (name, 0, 0);
                    153: 
                    154:          while (fontfile < 0) {
                    155:            char *fend;
                    156: 
                    157:            if ((fend = index(fontpath, ':')) != 0)
                    158:              *fend = '\0';
                    159:            if (*fontpath == '\0') {
                    160:              errno = EINVAL;
                    161:              return (NULL);
                    162:            }
                    163:            
                    164:            if (*fontpath == '~') {
                    165:              /* XXX - should implement ~foobar as well */
                    166:              strcpy (fontname, getenv("HOME"));
                    167:              strcat (fontname, "/");
                    168:              fontpath++;
                    169:            } else
                    170:              *fontname = '\0';
                    171:            strcat (fontname, fontpath);
                    172:            strcat (fontname, "/");
                    173:            strcat (fontname, name);
                    174:            strcat (fontname, DEFAULT_FONT_SUFFIX);
                    175: 
                    176:            fontfile = open (fontname, 0, 0);
                    177:            if (fend) {
                    178:              *fend = ':';
                    179:              fontpath = ++fend;
                    180:            } else
                    181:              break;
                    182:          }
                    183:          if (read (fontfile, (caddr_t) &font, sizeof (FontData)) != sizeof (FontData)) {
                    184:            close (fontfile);
                    185:            errno = EINVAL;
                    186:            return (NULL);
                    187:          }
                    188:          Swap_shorts((short *) &font, sizeof (FontData)>>1);
                    189: 
                    190:          fontsize = BitmapSize(chars->bm_width, chars->bm_height);
                    191:          fontarea = (char *) Xalloc (fontsize);
                    192:          bzero( fontarea, fontsize );
                    193:          lseek (fontfile, (long) font.f_characters[0], 0);
                    194:          if (read (fontfile, fontarea, fontsize) != fontsize) {
                    195:            close (fontfile);
                    196:            free (fontarea);
                    197:            errno = EINVAL;
                    198:            return (NULL);
                    199:          }
                    200:          Swap_shorts((short *)fontarea, fontsize>>1);
                    201: 
                    202:          leftarea  = (short *) Xalloc (tablesize);
                    203:          bzero(leftarea, tablesize);
                    204:          leftarray = (short *) Xalloc (tablesize);
                    205:          if (font.f_fixedWidth == 0) {
                    206:            leftsize = (font.f_lastChar - font.f_firstChar + 2) * sizeof (short);
                    207:            lseek (fontfile, (long) font.f_leftArray[0], 0);
                    208:            if (read (fontfile, & leftarea[font.f_firstChar], leftsize) 
                    209:                != leftsize) {
                    210:                  close (fontfile);
                    211:                  free (fontarea);
                    212:                  free ((caddr_t) leftarea);
                    213:                  free ((caddr_t) leftarray);
                    214:                  errno = EINVAL;
                    215:                  return (NULL);
                    216:                }
                    217:            Swap_shorts(((short *)& leftarea[font.f_firstChar]), leftsize>>1);
                    218:          } else { /* if fixed width font, generate leftarray for use later */
                    219:            j = 0;
                    220:            for (i = font.f_firstChar; i <= font.f_lastChar + 1; i++) {
                    221:              leftarea[i] = j;
                    222:              j += font.f_fixedWidth;
                    223:            }
                    224:          }
                    225:          bcopy(leftarea, leftarray, tablesize);
                    226: 
                    227:          close (fontfile);
                    228:     /*
                    229:      *  set up font data structures
                    230:      */
                    231: 
                    232:          fd = (FONT *) Xalloc (sizeof (FONT));
                    233: 
                    234:          fd->height = chars->bm_height;
                    235:          fd->first = font.f_firstChar;
                    236:          fd->last = font.f_lastChar;
                    237:          fd->base = font.f_baseline;
                    238:          fd->space = font.f_spaceIndex;
                    239:          fd->space += fd->first;
                    240:          fd->refcnt = 1;
                    241: 
                    242: 
                    243:          fd->name = (char *) Xalloc (strlen (name) + 1);
                    244:          strcpy (fd->name, name);
                    245: 
                    246:     /*
                    247:      * set up the private font structure
                    248:      */
                    249:          fpriv = (FontPriv *) Xalloc (sizeof (FontPriv));
                    250: 
                    251:          if (fd->avg_width = font.f_fixedWidth) {
                    252:            fd->fixed = 1;
                    253:            fpriv->maxwidth = fd->avg_width;
                    254:          }
                    255:          else
                    256:            fd->fixed = 0;
                    257:          fd->data = (caddr_t) fpriv;
                    258: 
                    259:          fpriv->widths = leftarea;
                    260:          fpriv->leftarray = leftarray;
                    261:          fpriv->maxwidth = 0;
                    262: 
                    263: /*  of course... the bits are all switched...  */
                    264:          {   register short *sh = (short *) fontarea;
                    265:              register short limit = ((chars->bm_width+15)>>4)*chars->bm_height;
                    266:              do *sh = ReverseBitsInShort(*sh), sh++;
                    267:              while (--limit != -1);
                    268:            }
                    269: 
                    270: /* convert the leftarray to the width table */
                    271:          for (i = fd->first; i <= fd->last; i++) {
                    272:            width = fpriv->leftarray[i + 1] - fpriv->leftarray[i];
                    273:            if (width > fpriv->maxwidth) fpriv->maxwidth = width;
                    274:            if (width < 0) {
                    275:              width = 0;        /* font sanity check */
                    276:              errno = EINVAL;
                    277:              return(NULL);
                    278:            }
                    279:            fpriv->widths[i] = width;
                    280:          }
                    281:          fd->avg_width = ((fpriv->leftarray[fd->last]  - 
                    282:                            fpriv->leftarray[fd->first]) / (fd->last - fd->first));
                    283:          
                    284:          if ((fpriv->strike = make_bitmap( fontarea, chars->bm_width, chars->bm_height) ) == NULL) {
                    285:            free (fontarea);
                    286:            free ((caddr_t) leftarea);
                    287:            free ((caddr_t) leftarray);
                    288:            free ((caddr_t) fd);
                    289:            free ((caddr_t) fpriv);
                    290:            errno = EINVAL;
                    291:            return (NULL);
                    292:          }
                    293: 
                    294: /*    make_fontmap(fd); */
                    295:     /*  XXX free fontarea */
                    296: 
                    297: #undef chars
                    298:        }
                    299:        return (fd);
                    300:       }
                    301: 
                    302: FreeFont (font)
                    303:        register FONT *font;
                    304: {
                    305:     FontPriv   * fp;
                    306:     status_$t status;
                    307: 
                    308:     fp = (FontPriv *)font->data;
                    309:     if (fp->ap_font)
                    310:       gpr_$unload_font_file((short)fp->ap_font_id, status);
                    311: 
                    312:     free ((caddr_t) font->data);
                    313:     free (font->name);
                    314:     free ((caddr_t) font);
                    315: }

unix.superglobalmegacorp.com

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