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

1.1       root        1:     /*
                      2: 
                      3:     Copyright 1986 by the University of Utah
                      4: 
                      5:     Permission to use, copy, modify, and distribute this
                      6:     software and its documentation for any purpose and without
                      7:     fee is hereby granted, provided that the above copyright
                      8:     notice appear in all copies and that both that copyright
                      9:     notice and this permission notice appear in supporting
                     10:     documentation, and that the name of the University of Utah
                     11:     not be used in advertising or publicity pertaining to 
                     12:     distribution of the software without specific, written 
                     13:     prior permission. The University of Utah makes no
                     14:     representations about the suitability of this software for
                     15:     any purpose.  It is provided "as is" without express or
                     16:     implied warranty.
                     17: 
                     18:     */
                     19: 
                     20: /* cvtfont.c   Reads an X font from a file and stores an Apollo format
                     21:  *              copy on disk
                     22:  *
                     23:  *     GetFont         Takes a font name and converts the font
                     24:  *
                     25:  */
                     26: 
                     27: #include "Xapollo.h"
                     28: #include "vssite.h"
                     29: #include "../libvs100/param.h"
                     30: #include <errno.h>
                     31: #include <sys/file.h>
                     32: #include "/sys/ins/smdu.ins.c"
                     33: 
                     34: extern int errno;
                     35: static gpr_$offset_t off;
                     36: status_$t status;
                     37: 
                     38: char *strcpy(), *strcat();
                     39: long lseek();
                     40: 
                     41: #define CHARPERFONT 256
                     42: 
                     43: static short ReverseBitsInByte[256] = {
                     44: 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
                     45: 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
                     46: 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
                     47: 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
                     48: 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
                     49: 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
                     50: 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
                     51: 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
                     52: 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
                     53: 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
                     54: 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
                     55: 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
                     56: 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
                     57: 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
                     58: 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
                     59: 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
                     60: };
                     61: 
                     62: #define ReverseBitsInShort(s) ((ReverseBitsInByte[(s)&0xff]<<8)|ReverseBitsInByte[((s)>>8)&0xff])
                     63: 
                     64: 
                     65: BITMAP *
                     66: make_bitmap( area, width, height )
                     67: short * area;
                     68: int width;
                     69: int height;
                     70:     {
                     71: 
                     72:     BITMAP * bm; 
                     73:     gpr_$bitmap_desc_t bitmap;
                     74:     static gpr_$attribute_desc_t attr = -1;
                     75:     gpr_$offset_t size;
                     76: 
                     77:     short * pointer;
                     78:     short bwid;
                     79:     int rowwid;
                     80: 
                     81:     register int i;
                     82: 
                     83:     if( (bm = (BITMAP *)malloc(sizeof(BITMAP))) == NULL )
                     84:         return( NULL );
                     85:     
                     86:     bm->width = width;
                     87:     bm->height = height;
                     88:     bm->refcnt = 1;
                     89:     bm->kind = (int)apollo_bitmap;
                     90: 
                     91:     size.x_size = bm->width;
                     92:     size.y_size = bm->height;
                     93:     
                     94:     gpr_$allocate_attribute_block( attr, status );
                     95:     check_status(status, "make_bitmap ");
                     96:     gpr_$allocate_bitmap_nc( size, (gpr_$plane_t)0, attr, bitmap, status );
                     97:     check_status(status, "make_bitmap ");
                     98: 
                     99:     bm->data = (caddr_t)bitmap;
                    100:     gpr_$inq_bitmap_pointer( bitmap, pointer, bwid,  status );
                    101:                      
                    102:     rowwid = ((width+15)>>4);
                    103:     for( i=0; i<height; i++ )
                    104:         {
                    105:         bcopy( area, pointer, rowwid*2 );
                    106:         pointer += bwid;
                    107:         area += rowwid;
                    108:         }
                    109: 
                    110:     return( bm );
                    111: 
                    112:     }
                    113: 
                    114: make_fontfile( fd, name, invert )
                    115: FONT *fd;
                    116: char *name;
                    117: boolean invert;
                    118: 
                    119:     {
                    120:     FontPriv *fpriv = (FontPriv *)fd->data;
                    121:     BITMAP *bm;
                    122:     short namelen;
                    123:     smd_$font_table_t *ap_font_info; 
                    124:     smd_$v1_fdte_t *desc_entry;
                    125:     int line_width, i, j;
                    126:     short *memptr;
                    127:     short *image_ptr;
                    128:     long file_length;
                    129:     char lname[64];
                    130: 
                    131:     strcpy(lname, DEFAULT_APOLLO_FONT_PATH);
                    132:     strcat(lname, name);
                    133:     bm = fpriv->strike;
                    134:     if (invert) {
                    135:         gpr_$window_t window;
                    136:         gpr_$position_t dest;
                    137: 
                    138:         strncat( lname, ".i", 2);
                    139:         window.x_coord = 0;
                    140:         window.y_coord = 0;
                    141:         window.x_size = 224;
                    142:         window.y_size = bm->height;
                    143:         dest.x_coord = 0;
                    144:         dest.y_coord = 0;
                    145:         gpr_$set_bitmap( bm->data, status);
                    146:         gpr_$set_raster_op( (gpr_$plane_t)0, (gpr_$raster_op_t)12, status );
                    147:         gpr_$bit_blt(bm->data, window, (short)0, dest, (short)0, status );
                    148:         }
                    149:     gpr_$inq_bitmap_pointer(bm->data, (long)memptr, (short)line_width, status);
                    150: 
                    151:     namelen = strlen(lname);
                    152:     file_length = 224 * 224 + sizeof( smd_$font_table_t ) + 65535;
                    153:     ap_font_info = (smd_$font_table_t *)
                    154:       ms_$crmapl( *lname, namelen, (long)0, file_length, ms_$nr_xor_1w, status );
                    155:     check_status(status, "Creating apollo font file");      
                    156: 
                    157:     image_ptr = (short *)&(ap_font_info->desc_table[127]);
                    158: 
                    159:     for (i=0; i<bm->height; i++) {
                    160:       for (j=0; j<14; j++) {
                    161:         *image_ptr = *memptr; 
                    162:         image_ptr++;
                    163:         memptr++;
                    164:         }
                    165:       for (j=0; j<50; j++)
                    166:         memptr++;
                    167:       }
                    168:     ap_font_info->v_spacing = 0;
                    169:     ap_font_info->h_spacing = 0;               
                    170: 
                    171:     ap_font_info->version = 1;
                    172:     ap_font_info->chars_in_font = 127;
                    173:     ap_font_info->max_up = fd->height;
                    174:     ap_font_info->max_width = fpriv->maxwidth;
                    175:     ap_font_info->max_right = fpriv->maxwidth;
                    176:     ap_font_info->max_down = 0;
                    177:     ap_font_info->max_height = fd->height;
                    178:     ap_font_info->space_size =  fpriv->widths[fd->space];
                    179: 
                    180:     desc_entry = &(ap_font_info->desc_table);
                    181:     for (i=0; i<127; i++) {
                    182:         ap_font_info->index_table[i] = i+1;
                    183:         ap_font_info->desc_table[i].left = 0;
                    184:         ap_font_info->desc_table[i].right = fpriv->widths[i];
                    185:         ap_font_info->desc_table[i].up = fd->height;
                    186:         ap_font_info->desc_table[i].down = 0;
                    187:         ap_font_info->desc_table[i].width = fpriv->widths[i];
                    188:         ap_font_info->desc_table[i].x_pos = fpriv->leftarray[i] &0777;
                    189:         ap_font_info->desc_table[i].y_pos = (fpriv->leftarray[i] >> 10) * fd->height;
                    190:         desc_entry++;
                    191:         }
                    192: 
                    193:     ap_font_info->raster_lines = (--desc_entry)->y_pos + fd->height;
                    194:     if (ap_font_info->raster_lines <= (65535 / 28)) 
                    195:         ap_font_info->image_size = (ap_font_info->raster_lines + 4) * 28;
                    196:     else ap_font_info->image_size = 65535;
                    197:     ap_font_info->image_offset = smd_$font_header_size + 
                    198:       smd_$font_index_table_size + (smd_$v1_fdte_size * 127) ;
                    199:     ms_$truncate( ap_font_info, ap_font_info->image_offset +
                    200:                 ap_font_info->image_size, status );
                    201:     ms_$unmap( ap_font_info, ap_font_info->image_offset +
                    202:              ap_font_info->image_size, status );
                    203: }
                    204: 
                    205: FONT *
                    206: make_fontmap( fd )
                    207: FONT *fd;
                    208:     {
                    209: 
                    210:     int width;
                    211:     int height;
                    212:     BITMAP * bm; 
                    213:     gpr_$bitmap_desc_t bitmap;
                    214:     static gpr_$attribute_desc_t attr = -1;
                    215:     gpr_$window_t window;
                    216:     gpr_$position_t dest;
                    217:     static int got_attr = 0;
                    218:     gpr_$offset_t size;
                    219:     FontPriv *fpriv;
                    220: 
                    221:     short col, row;
                    222:     short left, oldleft, wid, oldwid;
                    223:     int start, stop;
                    224: 
                    225:     register int i;
                    226: 
                    227:     fpriv = (FontPriv *)fd->data;
                    228:     bm = fpriv->strike;
                    229:     width = fd->last * fd->avg_width;
                    230:     height = (width / 224) + 1;
                    231:     height = height * fd->height;
                    232: /* should check for height > ???some max value */
                    233:     size.x_size = 224;
                    234:     size.y_size = height;
                    235:     
                    236:     gpr_$allocate_attribute_block( attr, status );
                    237:     check_status(status, "make_fontfile ");
                    238:     gpr_$acquire_display( status );
                    239:     gpr_$allocate_bitmap( size, (gpr_$plane_t)0, attr, bitmap, status );
                    240:     check_status(status, "make_fontfile ");
                    241: 
                    242:     row = start = col = 0;
                    243:     gpr_$set_bitmap( bitmap, status);
                    244:     gpr_$set_raster_op(0, (gpr_$raster_op_t)12, status);
                    245:     for (i=0; i<=fd->last; i++) {
                    246:       left = fpriv->leftarray[i];
                    247:       wid = fpriv->widths[i];
                    248:       if ((left + wid) > (start + 224)) {
                    249:         stop = oldleft + oldwid;
                    250:         window.x_coord = start;
                    251:         window.y_coord = 0;
                    252:         window.x_size = stop - start;
                    253:         window.y_size = fd->height;
                    254:         dest.x_coord = 0;
                    255:         dest.y_coord = row * fd->height;
                    256:         gpr_$bit_blt(bm->data, window, (short)0, dest, (short)0, status);
                    257:         start = stop;
                    258:         row++;
                    259:         col = 0;
                    260:         }
                    261:       oldleft = left;
                    262:       oldwid = wid;
                    263:       fpriv->leftarray[i] = col + (row << 10);
                    264:       col += fpriv->widths[i];
                    265:       }
                    266:     if (start != (oldleft + oldwid)) {
                    267:       window.x_coord = start;
                    268:       window.x_size = (left + wid) - start;
                    269:       window.y_size = fd->height;
                    270:       dest.y_coord = row * fd->height;
                    271:       gpr_$bit_blt(bm->data, window, (short)0, dest, (short)0, status);
                    272:       check_status( status, make_fontmap );
                    273:       }
                    274:     bm->width = 224;
                    275:     bm->height = height;
                    276:     bm->refcnt = 1;
                    277:     bm->kind = (int)apollo_bitmap;
                    278: 
                    279:     bm->data = (caddr_t)bitmap;
                    280:     return( fd );
                    281: 
                    282:     }
                    283: 
                    284: 
                    285: FONT
                    286: *GetFont (name)
                    287:        char *name;
                    288: {
                    289:        char fontname[256];
                    290:        int fontfile = -1;
                    291:        FontData font;
                    292: #define chars ((BitMap *) font.f_characters)
                    293:        int fontsize, leftsize, width, i, j;
                    294:        char *fontarea;
                    295:        register short *leftarea, *leftarray;
                    296:        register FONT *fd;
                    297:        register FontPriv *fpriv;
                    298:        int tablesize = (CHARPERFONT + 1) * sizeof(short);
                    299:        extern char *getenv(), *index();
                    300:        static char *Fontpath = NULL;
                    301:        char *fontpath;
                    302:        char lname[40];
                    303:        int namelen;
                    304: 
                    305:        if ((fontpath = Fontpath) == NULL)
                    306:            fontpath = DEFAULT_FONT_PATH;
                    307: 
                    308:        fontfile = open (name, 0, 0);
                    309: 
                    310:        while (fontfile < 0) {
                    311:            char *fend;
                    312: 
                    313:            if ((fend = index(fontpath, ':')) != 0)
                    314:                *fend = '\0';
                    315:            if (*fontpath == '\0') {
                    316:                errno = EINVAL;
                    317:                return (NULL);
                    318:            }
                    319:            
                    320:            if (*fontpath == '~') {
                    321:                /* XXX - should implement ~foobar as well */
                    322:                strcpy (fontname, getenv("HOME"));
                    323:                strcat (fontname, "/");
                    324:                fontpath++;
                    325:            } else
                    326:                *fontname = '\0';
                    327:            strcat (fontname, fontpath);
                    328:            strcat (fontname, "/");
                    329:            strcat (fontname, name);
                    330:            strcat (fontname, DEFAULT_FONT_SUFFIX);
                    331: 
                    332:            fontfile = open (fontname, 0, 0);
                    333:            if (fend) {
                    334:                *fend = ':';
                    335:                fontpath = ++fend;
                    336:            } else
                    337:                break;
                    338:        }
                    339:        if (read (fontfile, (caddr_t) &font, sizeof (FontData)) != sizeof (FontData)) {
                    340:            close (fontfile);
                    341:            errno = EINVAL;
                    342:            return (NULL);
                    343:        }
                    344:        Swap_shorts((short *) &font, sizeof (FontData)>>1);
                    345: 
                    346:        fontsize = BitmapSize(chars->bm_width, chars->bm_height);
                    347:        fontarea = (char *) malloc (fontsize);
                    348:        bzero( fontarea, fontsize );
                    349:        lseek (fontfile, (long) font.f_characters[0], 0);
                    350:        if (read (fontfile, fontarea, fontsize) != fontsize) {
                    351:            close (fontfile);
                    352:            free (fontarea);
                    353:            errno = EINVAL;
                    354:            return (NULL);
                    355:        }
                    356:        Swap_shorts((short *)fontarea, fontsize>>1);
                    357: 
                    358:        leftarea  = (short *) malloc (tablesize);
                    359:        bzero(leftarea, tablesize);
                    360:        leftarray = (short *) malloc (tablesize);
                    361:        if (font.f_fixedWidth == 0) {
                    362:            leftsize = (font.f_lastChar - font.f_firstChar + 2) * sizeof (short);
                    363:            lseek (fontfile, (long) font.f_leftArray[0], 0);
                    364:            if (read (fontfile, & leftarea[font.f_firstChar], leftsize) 
                    365:                        != leftsize) {
                    366:                close (fontfile);
                    367:                free (fontarea);
                    368:                free ((caddr_t) leftarea);
                    369:                free ((caddr_t) leftarray);
                    370:                errno = EINVAL;
                    371:                return (NULL);
                    372:            }
                    373:            Swap_shorts(((short *)& leftarea[font.f_firstChar]), leftsize>>1);
                    374:        } else { /* if fixed with font, generate leftarray for use later */
                    375:            j = 0;
                    376:            for (i = font.f_firstChar; i <= font.f_lastChar + 1; i++) {
                    377:                leftarea[i] = j;
                    378:                j += font.f_fixedWidth;
                    379:            }
                    380:        }
                    381:        bcopy(leftarea, leftarray, tablesize);
                    382: 
                    383:        close (fontfile);
                    384:     /*
                    385:      *  set up font data structures
                    386:      */
                    387: 
                    388:        fd = (FONT *) malloc (sizeof (FONT));
                    389: 
                    390:        fd->height = chars->bm_height;
                    391:        fd->first = font.f_firstChar;
                    392:        fd->last = font.f_lastChar;
                    393:        fd->base = font.f_baseline;
                    394:        fd->space = font.f_spaceIndex;
                    395:        fd->space += fd->first;
                    396:        fd->refcnt = 1;
                    397: 
                    398: 
                    399: 
                    400:        fd->name = (char *) malloc (strlen (name) + 1);
                    401:        strcpy (fd->name, name);
                    402: 
                    403: 
                    404:     /*
                    405:      * set up the private font structure
                    406:      */
                    407:        fpriv = (FontPriv *) malloc (sizeof (FontPriv));
                    408: 
                    409:        if (fd->avg_width = font.f_fixedWidth) {
                    410:            fd->fixed = 1;
                    411:            fpriv->maxwidth = fd->avg_width;
                    412:            }
                    413:        else
                    414:            fd->fixed = 0;
                    415:        fd->data = (caddr_t) fpriv;
                    416: 
                    417:        fpriv->widths = leftarea;
                    418:        fpriv->leftarray = leftarray;
                    419:        fpriv->maxwidth = 0;
                    420: 
                    421:     /*  of course... the bits are all switched... naturally... of course... */
                    422:        {   register short *sh = (short *) fontarea;
                    423:            register short limit = ((chars->bm_width+15)>>4)*chars->bm_height;
                    424:            do *sh = ReverseBitsInShort(*sh), sh++;
                    425:            while (--limit != -1);
                    426:        }
                    427: 
                    428:        /* convert the leftarray to the width table */
                    429:        for (i = fd->first; i <= fd->last; i++) {
                    430:            width = fpriv->leftarray[i + 1] - fpriv->leftarray[i];
                    431:            if (width > fpriv->maxwidth) fpriv->maxwidth = width;
                    432:            if (width < 0) {
                    433:                    width = 0;  /* font sanity check */
                    434:                    errno = EINVAL;
                    435:                    return(NULL);
                    436:                }
                    437:            fpriv->widths[i] = width;
                    438:     }
                    439:     fd->avg_width = ((fpriv->leftarray[fd->last]  - 
                    440:        fpriv->leftarray[fd->first]) / (fd->last - fd->first));
                    441: 
                    442:     if ((fpriv->strike = make_bitmap( fontarea, chars->bm_width, chars->bm_height) ) == NULL) {
                    443:            free (fontarea);
                    444:            free ((caddr_t) leftarea);
                    445:            free ((caddr_t) leftarray);
                    446:            free ((caddr_t) fd);
                    447:            free ((caddr_t) fpriv);
                    448:            errno = EINVAL;
                    449:            return (NULL);
                    450:        }
                    451: 
                    452:     make_fontmap(fd);
                    453:     make_fontfile(fd, name, false);
                    454:     make_fontfile(fd, name, true);
                    455:     /*  XXX free fontarea */
                    456: 
                    457:        return (fd);
                    458: #undef chars
                    459: }
                    460: 
                    461: OpenDisplay ()
                    462: {                     
                    463:     gpr_$bitmap_desc_t bm;
                    464:                        
                    465:     off.x_size = 1024;
                    466:     off.y_size = 1024;
                    467:     gpr_$init( gpr_$direct, (short)1, off, (short)0, bm, status );
                    468:     if ( status.all != status_$ok ) {
                    469:         error_$print( status );
                    470:         return( NULL );             
                    471:         }
                    472:     return;
                    473: 
                    474: }
                    475: 
                    476: #define swaps(x) n = ((char *) (x))[0];\
                    477:                 ((char *) (x))[0] = ((char *) (x))[1];\
                    478:                 ((char *) (x))[1] = n
                    479: 
                    480: Swap_shorts (list, count)
                    481:        register short *list;
                    482:        register int count;
                    483: {
                    484:     unsigned int n; 
                    485: 
                    486:        while (--count >= 0) {
                    487:            swaps(list);
                    488:            list++;
                    489:        }
                    490: }
                    491: 
                    492: check_status(status, name)
                    493: status_$t status;        
                    494: char *name;
                    495: {
                    496:     if (status.all != status_$ok) {
                    497:         fprintf(stderr, "%s", name);
                    498:         error_$print(status);   
                    499:         exit(1);
                    500:     }
                    501: }
                    502: main(argc, argv)
                    503: int argc;
                    504: char **argv;
                    505: {
                    506:     char *fontname;
                    507: 
                    508:     OpenDisplay();
                    509:     fontname = *(++argv);
                    510:     GetFont(fontname);
                    511: }

unix.superglobalmegacorp.com

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