Annotation of 43BSD/contrib/X/libsun/font.c, revision 1.1

1.1     ! root        1: #ifdef sun
        !             2: /*
        !             3:  * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
        !             4:  * for unrestricted use provided that this legend is included on all tape
        !             5:  * media and as a part of the software program in whole or part.  Users
        !             6:  * may copy or modify these drivers without charge, but are not authorized
        !             7:  * to license or distribute them to anyone else except as part of a product or
        !             8:  * program developed by the user.
        !             9:  * 
        !            10:  * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
        !            11:  * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
        !            12:  * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
        !            13:  * PRACTICE.
        !            14:  *
        !            15:  * The Sun X Drivers are provided with no support and without any obligation
        !            16:  * on the part of Sun Microsystems, Inc. to assist in their use, correction,
        !            17:  * modification or enhancement.
        !            18:  * 
        !            19:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
        !            20:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
        !            21:  * DRIVERS OR ANY PART THEREOF.
        !            22:  * 
        !            23:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
        !            24:  * or profits or other special, indirect and consequential damages, even if
        !            25:  * Sun has been advised of the possibility of such damages.
        !            26:  * 
        !            27:  * Sun Microsystems, Inc.
        !            28:  * 2550 Garcia Avenue
        !            29:  * Mountain View, California  94043
        !            30:  */
        !            31: 
        !            32: #ifndef        lint
        !            33: static char sccsid[] = "@(#)font.c 2.1 86/01/28 Copyright 1986 Sun Micro";
        !            34: #endif
        !            35: 
        !            36: /*-
        !            37:  * Copyright 1985, Massachusetts Institute of Technology
        !            38:  * Copyright (c) 1986 by Sun Microsystems,  Inc.
        !            39:  */
        !            40: 
        !            41: /* font.c      Reads a font from a file and stores it on the workstation
        !            42:  *
        !            43:  *     GetFont         Takes a font name and stores it
        !            44:  *     FreeFont        Frees the storage taken by a font
        !            45:  *
        !            46:  */
        !            47: 
        !            48: /*
        !            49:  *     ToDo:
        !            50:  *             Use Sun fonts too
        !            51:  */
        !            52: 
        !            53: #include "Xsun.h"
        !            54: #include "vssite.h"
        !            55: #include "../libvs100/param.h"
        !            56: #include <errno.h>
        !            57: 
        !            58: extern int errno;
        !            59: 
        !            60: char *Xalloc(), *strcpy(), *strcat();
        !            61: long lseek();
        !            62: 
        !            63: #define CHARPERFONT 256
        !            64: 
        !            65: static short ReverseBitsInByte[256] = {
        !            66: 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
        !            67: 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
        !            68: 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
        !            69: 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
        !            70: 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
        !            71: 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
        !            72: 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
        !            73: 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
        !            74: 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
        !            75: 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
        !            76: 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
        !            77: 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
        !            78: 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
        !            79: 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
        !            80: 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
        !            81: 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
        !            82: };
        !            83: 
        !            84: #define ReverseBitsInShort(s) ((ReverseBitsInByte[(unsigned char)(s)]<<8)|ReverseBitsInByte[(unsigned char)((s)>>8)])
        !            85: 
        !            86: /* 
        !            87:  * this routine converts strike format into Sun font format
        !            88:  * XXX - it's embarrasingly slow,  but I'm in too much of a hurry
        !            89:  *     to do anything better for now.  The font stuff is for the deep
        !            90:  *     six anyway..... (DSHR).
        !            91:  */
        !            92: struct pixfont *
        !            93: striketopixfont(fn)
        !            94:        FONT *fn;
        !            95: {
        !            96:     register FontPriv *fp = (FontPriv *)fn->data;
        !            97:     register struct pixfont *pf;
        !            98:     register int         fheight = fn->height;
        !            99:     register int         i, j;
        !           100: 
        !           101:     ((struct pixfont *)fn->data) = pf = (struct pixfont *) Xalloc(sizeof(struct pixfont));
        !           102:     if (pf != NULL) {
        !           103:        extern struct pixrectops mem_ops;
        !           104:        static struct mpr_data mprd;
        !           105:        static struct pixrect spr = {&mem_ops,2000,1000,1,(caddr_t)&mprd};
        !           106:        {   register short *sh = (short *) fp->fltable[0];
        !           107:            register short limit = (fp->wpitch>>1)*fheight;
        !           108:            do *sh = ReverseBitsInShort(*sh), sh++;
        !           109:            while (--limit != -1);
        !           110:        }
        !           111:        mprd.md_linebytes = fp->wpitch;
        !           112:        mprd.md_image = (short *) fp->fltable[0];
        !           113:        bzero((caddr_t) pf, sizeof(struct pixfont));
        !           114:        pf->pf_defaultsize.y = fheight;
        !           115:        if (fn->fixed)
        !           116:            pf->pf_defaultsize.x = fn->avg_width;
        !           117:        for (i = fn->first; i <= fn->last; i++) {
        !           118:            register    w = fp->widths[i];
        !           119: #ifdef undef
        !           120:            register    offset = fp->leftarray[i];
        !           121: #endif
        !           122:            register struct pixchar *pc = &(pf->pf_char[i]);
        !           123: 
        !           124:            if (w < 0)
        !           125:                continue;       /* Sanity check */
        !           126:            pc->pc_pr = mem_create(w, fheight, 1);
        !           127:            pc->pc_home.x = 0;
        !           128:            pc->pc_home.y = fheight - fn->base;
        !           129:            pc->pc_adv.x = w;
        !           130:            pc->pc_adv.y = 0;
        !           131:            pr_rop(pc->pc_pr,0,0,w,fheight,PIX_SRC,
        !           132:                   &spr, fp->leftarray[i], 0);
        !           133: #ifdef undef
        !           134:            for (j = 0; j < fheight; j++) {
        !           135:                register int k;
        !           136:                for (k = 0; k < w; k++) {
        !           137:                    int bit;
        !           138: 
        !           139:                    bit = (*((u_short *)fp->fltable[j] + ((offset+k) >> 4)));
        !           140:                    bit >>= ((offset + k) % 16);
        !           141:                    bit &= 1;
        !           142:                    pr_put(pc->pc_pr, k, j, bit);
        !           143: 
        !           144:                }
        !           145:            }
        !           146: #endif
        !           147:        }
        !           148:     }
        !           149:     free((caddr_t) fp);
        !           150:     return ((struct pixfont *)fn->data);
        !           151: }
        !           152: 
        !           153: FONT *GetFont (name)
        !           154:        char *name;
        !           155: {
        !           156:        char fontname[256];
        !           157:        int fontfile = -1;
        !           158:        FontData font;
        !           159: #define chars ((BitMap *) font.f_characters)
        !           160:        int fontsize, leftsize, width, i, j;
        !           161:        char *fontarea;
        !           162:        register short *leftarea, *leftarray;
        !           163:        register FONT *fd;
        !           164:        register FontPriv *fpriv;
        !           165:        int tablesize = (CHARPERFONT + 1) * sizeof(short);
        !           166:        extern char *getenv(), *index();
        !           167:        static char *Fontpath = NULL;
        !           168:        char *fontpath;
        !           169: 
        !           170:        if (!Fontpath) {
        !           171:            char *temp = getenv("XFONTPATH");
        !           172: 
        !           173:            if (temp) {
        !           174:                Fontpath = Xalloc(strlen(temp) + 1);
        !           175:                strcpy(Fontpath, temp);
        !           176:            }
        !           177:        }
        !           178:        
        !           179:        if ((fontpath = Fontpath) == NULL)
        !           180:            fontpath = DEFAULT_FONT_PATH;
        !           181: 
        !           182:        fontfile = open (name, 0, 0);
        !           183: 
        !           184:        while (fontfile < 0) {
        !           185:            char *fend;
        !           186: 
        !           187:            if ((fend = index(fontpath, ':')) != 0)
        !           188:                *fend = '\0';
        !           189:            if (*fontpath == '\0') {
        !           190:                errno = EINVAL;
        !           191:                return (NULL);
        !           192:            }
        !           193:            
        !           194:            if (*fontpath == '~') {
        !           195:                /* XXX - should implement ~foobar as well */
        !           196:                strcpy (fontname, getenv("HOME"));
        !           197:                strcat (fontname, "/");
        !           198:                fontpath++;
        !           199:            } else
        !           200:                *fontname = '\0';
        !           201:            strcat (fontname, fontpath);
        !           202:            strcat (fontname, "/");
        !           203:            strcat (fontname, name);
        !           204:            strcat (fontname, DEFAULT_FONT_SUFFIX);
        !           205: 
        !           206:            fontfile = open (fontname, 0, 0);
        !           207:            if (fend) {
        !           208:                *fend = ':';
        !           209:                fontpath = ++fend;
        !           210:            } else
        !           211:                break;
        !           212:        }
        !           213: 
        !           214:        if (read (fontfile, (caddr_t) &font, sizeof (FontData)) != sizeof (FontData)) {
        !           215:            close (fontfile);
        !           216:            errno = EINVAL;
        !           217:            return (NULL);
        !           218:        }
        !           219:        Swap_shorts((short *) &font, sizeof (FontData)>>1);
        !           220: 
        !           221:        fontsize = BitmapSize(chars->bm_width, chars->bm_height);
        !           222:        fontarea = (char *) Xalloc (fontsize);
        !           223:        lseek (fontfile, (long) font.f_characters[0], 0);
        !           224:        if (read (fontfile, fontarea, fontsize) != fontsize) {
        !           225:            close (fontfile);
        !           226:            free (fontarea);
        !           227:            errno = EINVAL;
        !           228:            return (NULL);
        !           229:        }
        !           230:        Swap_shorts((short *)fontarea, fontsize>>1);
        !           231: 
        !           232:        leftarea  = (short *) Xalloc (tablesize);
        !           233:        bzero(leftarea, tablesize);
        !           234:        leftarray = (short *) Xalloc (tablesize);
        !           235:        if (font.f_fixedWidth == 0) {
        !           236:            leftsize = (font.f_lastChar - font.f_firstChar + 2) * sizeof (short);
        !           237:            lseek (fontfile, (long) font.f_leftArray[0], 0);
        !           238:            if (read (fontfile, & leftarea[font.f_firstChar], leftsize) 
        !           239:                        != leftsize) {
        !           240:                close (fontfile);
        !           241:                free (fontarea);
        !           242:                free ((caddr_t) leftarea);
        !           243:                free ((caddr_t) leftarray);
        !           244:                errno = EINVAL;
        !           245:                return (NULL);
        !           246:            }
        !           247:            Swap_shorts(((short *)& leftarea[font.f_firstChar]), leftsize>>1);
        !           248:        } else { /* if fixed with font, generate leftarray for use later */
        !           249:            j = 0;
        !           250:            for (i = font.f_firstChar; i <= font.f_lastChar + 1; i++) {
        !           251:                leftarea[i] = j;
        !           252:                j += font.f_fixedWidth;
        !           253:            }
        !           254:        }
        !           255:        bcopy(leftarea, leftarray, tablesize);
        !           256: 
        !           257:        close (fontfile);
        !           258: 
        !           259:        fd = (FONT *) Xalloc (sizeof (FONT));
        !           260: 
        !           261:        fd->height = chars->bm_height;
        !           262:        fd->first = font.f_firstChar;
        !           263:        fd->last = font.f_lastChar;
        !           264: 
        !           265:        fd->base = font.f_baseline;
        !           266:        fd->space = font.f_spaceIndex;
        !           267:        fd->space += fd->first;
        !           268:        fpriv = (FontPriv *) Xalloc (sizeof (FontPriv));
        !           269:        if (fd->avg_width = font.f_fixedWidth) {
        !           270:            fd->fixed = 1;
        !           271:            fpriv->maxwidth = fd->avg_width;
        !           272:            }
        !           273:        else
        !           274:            fd->fixed = 0;
        !           275: 
        !           276:        fd->refcnt = 1;
        !           277:        fd->data = (caddr_t) fpriv;
        !           278:        fpriv->widths = leftarea;
        !           279:        fpriv->leftarray = leftarray;
        !           280: 
        !           281:        if ((fpriv->strike = (BITMAP *) Xalloc(sizeof(BITMAP))) == NULL) {
        !           282:            free (fontarea);
        !           283:            free ((caddr_t) leftarea);
        !           284:            free ((caddr_t) leftarray);
        !           285:            free ((caddr_t) fd);
        !           286:            free ((caddr_t) fpriv);
        !           287:            errno = EINVAL;
        !           288:            return (NULL);
        !           289:        }
        !           290:        fpriv->wpitch = (((chars->bm_width + 15) >> 3) & ~1);
        !           291:        fpriv->strike->width = chars->bm_width;
        !           292:        fpriv->strike->height = chars->bm_height;
        !           293:        fpriv->strike->refcnt = 1;
        !           294:        fpriv->strike->data = (caddr_t) fontarea;
        !           295:        /*
        !           296:         * compute line table for font to eliminate multiply to find beginning
        !           297:         * of line.
        !           298:         */
        !           299:        fpriv->fltable = (char **)Xalloc(chars->bm_height * sizeof(caddr_t));
        !           300:        for (i = 0; i < chars->bm_height; i++) 
        !           301:                fpriv->fltable[i] = ((caddr_t) fontarea) + i * fpriv->wpitch;
        !           302: 
        !           303:        fd->name = (char *) Xalloc (strlen (name) + 1);
        !           304:        strcpy (fd->name, name);
        !           305: 
        !           306:        fpriv->maxwidth = 0;
        !           307: 
        !           308:        /* convert the leftarray to the width table */
        !           309:        for (i = fd->first; i <= fd->last; i++) {
        !           310:            width = fpriv->leftarray[i + 1] - fpriv->leftarray[i];
        !           311:            if (width > fpriv->maxwidth) fpriv->maxwidth = width;
        !           312:            if (width < 0) {
        !           313:                width = 0;      /* font sanity check */
        !           314: #ifdef notdef
        !           315:                DeviceError ("Bad font leftarray!\n");
        !           316: #else
        !           317:                errno = EINVAL;
        !           318:                return(NULL);
        !           319: #endif
        !           320:                }
        !           321:            fpriv->widths[i] = width;
        !           322:        }
        !           323:                
        !           324:         fd->avg_width = ((fpriv->leftarray[fd->last]  - 
        !           325:                fpriv->leftarray[fd->first]) / (fd->last - fd->first));
        !           326: 
        !           327:        striketopixfont(fd);
        !           328:        return (fd);
        !           329: #undef chars
        !           330: }
        !           331: 
        !           332: FreeFont (font)
        !           333:        register FONT *font;
        !           334: {
        !           335:        free ((caddr_t) font->data);
        !           336:        free (font->name);
        !           337:        free ((caddr_t) font);
        !           338: }
        !           339: #endif sun

unix.superglobalmegacorp.com

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