Annotation of 43BSD/contrib/X/libqvss/ddxfont.c, revision 1.1

1.1     ! root        1: /* font.c      Reads a font from a file and stores it on the workstation
        !             2:  *
        !             3:  *     GetFont         Takes a font name and stores it
        !             4:  *     FreeFont        Frees the storage taken by a font
        !             5:  *
        !             6:  * Modification History
        !             7:  *
        !             8:  *     Carver 8601.13 Fix reference to ../libvs100/param.h to be param.h
        !             9:  *
        !            10:  *      Jones  8510.15 Fix ``memory leak'' -- deallocate leftarry in FreeFont
        !            11:  *
        !            12:  *     Carver 8510.03 Increased the allocation size of the left array buffer
        !            13:  *                    by 1 word.  Fixes boundary problem.
        !            14:  */
        !            15: 
        !            16: #include "ddxqvss.h"
        !            17: #include "param.h"
        !            18: #include <errno.h>
        !            19: 
        !            20: extern int errno;
        !            21: extern char *ddxfontdir;
        !            22: extern char *ddxfontsuffix;
        !            23: char *Xalloc(), *strcpy(), *strcat();
        !            24: long lseek();
        !            25: 
        !            26: #define CHARPERFONT 256
        !            27: 
        !            28: FONT *GetFont (name)
        !            29:        char *name;
        !            30: {
        !            31:        char fontname[256];
        !            32:        int fontfile;
        !            33:        FontData font;
        !            34: #define chars ((BitMap *) font.f_characters)
        !            35:        int fontsize, leftsize, width, i, j;
        !            36:        char *fontarea;
        !            37:        register short *leftarea, *leftarray;
        !            38:        register FONT *fd;
        !            39:        register FontPriv *fpriv;
        !            40:        int tablesize = (CHARPERFONT + 1) * sizeof(short);  /* 8510.03 Carver */
        !            41: 
        !            42:        strcpy (fontname, ddxfontdir);
        !            43:        strcat (fontname, name);
        !            44:        strcat (fontname, ddxfontsuffix);
        !            45: 
        !            46:        if ((fontfile = open (fontname, 0)) == -1 &&
        !            47:            (errno != ENOENT || (fontfile = open (name, 0)) == -1)) {
        !            48:            errno = EINVAL;
        !            49:            return (NULL);
        !            50:        }
        !            51: 
        !            52:        if (read (fontfile, (caddr_t) &font, sizeof (FontData)) != sizeof (FontData)) {
        !            53:            close (fontfile);
        !            54:            errno = EINVAL;
        !            55:            return (NULL);
        !            56:        }
        !            57: 
        !            58:        fontsize = BitmapSize(chars->bm_width, chars->bm_height);
        !            59:        fontarea = (char *) Xalloc (fontsize);
        !            60:        lseek (fontfile, (long) font.f_characters[0], 0);
        !            61:        if (read (fontfile, fontarea, fontsize) != fontsize) {
        !            62:            close (fontfile);
        !            63:            free (fontarea);
        !            64:            errno = EINVAL;
        !            65:            return (NULL);
        !            66:        }
        !            67: 
        !            68:        leftarea  = (short *) Xalloc (tablesize);
        !            69:        bzero(leftarea, tablesize);
        !            70:        leftarray = (short *) Xalloc (tablesize);
        !            71:        if (font.f_fixedWidth == 0) {
        !            72:            leftsize = (font.f_lastChar - font.f_firstChar + 2) * sizeof (short);
        !            73:            lseek (fontfile, (long) font.f_leftArray[0], 0);
        !            74:            if (read (fontfile, & leftarea[font.f_firstChar], leftsize) 
        !            75:                        != leftsize) {
        !            76:                close (fontfile);
        !            77:                free (fontarea);
        !            78:                free ((caddr_t) leftarea);
        !            79:                free ((caddr_t) leftarray);
        !            80:                errno = EINVAL;
        !            81:                return (NULL);
        !            82:            }
        !            83:        } else { /* if fixed with font, generate leftarray for use later */
        !            84:            j = 0;
        !            85:            for (i = font.f_firstChar; i <= font.f_lastChar + 1; i++) {
        !            86:                leftarea[i] = j;
        !            87:                j += font.f_fixedWidth;
        !            88:            }
        !            89:        }
        !            90:        bcopy(leftarea, leftarray, tablesize);
        !            91: 
        !            92:        close (fontfile);
        !            93: 
        !            94:        fd = (FONT *) Xalloc (sizeof (FONT));
        !            95: 
        !            96:        fd->height = chars->bm_height;
        !            97:        fd->first = font.f_firstChar;
        !            98:        fd->last = font.f_lastChar;
        !            99: 
        !           100:        fd->base = font.f_baseline;
        !           101:        fd->space = font.f_spaceIndex;
        !           102:        fd->space += fd->first;
        !           103:        fpriv = (FontPriv *) Xalloc (sizeof (FontPriv));
        !           104:        if (fd->avg_width = font.f_fixedWidth) {
        !           105:            fd->fixed = 1;
        !           106:            fpriv->maxwidth = fd->avg_width;
        !           107:            }
        !           108:        else
        !           109:            fd->fixed = 0;
        !           110: 
        !           111:        fd->refcnt = 1;
        !           112:        fd->data = (caddr_t) fpriv;
        !           113:        fpriv->widths = leftarea;
        !           114:        fpriv->leftarray = leftarray;
        !           115: 
        !           116:        if ((fpriv->strike = (BITMAP *) Xalloc(sizeof(BITMAP))) == NULL) {
        !           117:            free (fontarea);
        !           118:            free ((caddr_t) leftarea);
        !           119:            free ((caddr_t) leftarray);
        !           120:            free ((caddr_t) fd);
        !           121:            free ((caddr_t) fpriv);
        !           122:            return (NULL);
        !           123:        }
        !           124:        fpriv->wpitch = (((chars->bm_width + 15) >> 3) & ~1);
        !           125:        fpriv->strike->width = chars->bm_width;
        !           126:        fpriv->strike->height = chars->bm_height;
        !           127:        fpriv->strike->refcnt = 1;
        !           128:        fpriv->strike->data = (caddr_t) fontarea;
        !           129:        /*
        !           130:         * compute line table for font to eliminate multiply to find beginning
        !           131:         * of line.
        !           132:         */
        !           133:        fpriv->fltable = (char **)Xalloc(chars->bm_height * sizeof(caddr_t));
        !           134:        for (i = 0; i < chars->bm_height; i++) 
        !           135:                fpriv->fltable[i] = ((caddr_t) fontarea) + i * fpriv->wpitch;
        !           136: 
        !           137:        fd->name = (char *) Xalloc (strlen (name) + 1);
        !           138:        strcpy (fd->name, name);
        !           139: 
        !           140:        fpriv->maxwidth = 0;
        !           141: 
        !           142:        /* convert the leftarray to the width table */
        !           143:        for (i = fd->first; i <= fd->last; i++) {
        !           144:            width = fpriv->leftarray[i + 1] - fpriv->leftarray[i];
        !           145:            if (width > fpriv->maxwidth) fpriv->maxwidth = width;
        !           146:            if (width < 0) {
        !           147:                width = 0;      /* font sanity check */
        !           148:                DeviceError ("Bad font leftarray!\n");
        !           149:                }
        !           150:            fpriv->widths[i] = width;
        !           151:        }
        !           152:                
        !           153:         fd->avg_width = ((fpriv->leftarray[fd->last]  - 
        !           154:                fpriv->leftarray[fd->first]) / (fd->last - fd->first));
        !           155: 
        !           156: /*     striketobitmaps(fd);*/
        !           157:        return (fd);
        !           158: #undef chars
        !           159: }
        !           160: 
        !           161: FreeFont (font)
        !           162:        register FONT *font;
        !           163: {
        !           164:        register FontPriv *data;
        !           165: 
        !           166:        data = FDATA(font);
        !           167: #ifdef DoStrikeArray
        !           168:        if (data->chrs) free ((caddr_t) data->chrs);
        !           169: #endif
        !           170:        if (data->leftarray) free ((caddr_t) data->leftarray);
        !           171:        if (data->widths) free ((caddr_t) data->widths);
        !           172:        free (data->fltable);
        !           173:        FreeBitmap(data->strike);
        !           174:        free ((caddr_t) data);
        !           175:        free (font->name);
        !           176:        free ((caddr_t) font);
        !           177: }
        !           178: 
        !           179: /* 
        !           180:  * this routine converts strike format into an array of bitmaps 
        !           181:  */
        !           182: #ifdef DoStrikeArray
        !           183: striketobitmaps(fn)
        !           184:        FONT *fn;
        !           185: {
        !           186:        register FontPriv *fp = FDATA(fn);
        !           187:        int fheight = fn->height;
        !           188:        int i, j;
        !           189:        register long *bits;
        !           190:        register int tmp;
        !           191:        int length = 
        !           192:                (fn->last - fn->first + 1) * fheight * sizeof(long);
        !           193:        if (fp->maxwidth > 32) return;
        !           194:        fp->chrs = bits = (long *)Xalloc( length );
        !           195:        bzero(bits, length);
        !           196: 
        !           197:        for (i = fn->first; i <= fn->last; i++) {
        !           198:            register w = fp->widths[i];
        !           199:            register offset = fp->leftarray[i];
        !           200:            if (w < 0) w = 0;           /* sanity check for bad fonts */
        !           201:                for (j = 0; j < fheight; j++) {
        !           202:                        register char *base = fp->fltable[j];
        !           203:                        tmp = extzv(base, offset, w);
        !           204:                    *bits = tmp;
        !           205:                    bits += 1;
        !           206:                }
        !           207:        }
        !           208:        return;
        !           209: }
        !           210: #endif

unix.superglobalmegacorp.com

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