|
|
1.1 ! root 1: /* ! 2: * $Source: /u1/X/libis/RCS/font.c,v $ ! 3: * $Header: font.c,v 1.1 86/11/17 14:34:11 swick Rel $ ! 4: */ ! 5: ! 6: #ifndef lint ! 7: static char *rcsid_font_c = "$Header: font.c,v 1.1 86/11/17 14:34:11 swick Rel $"; ! 8: #endif lint ! 9: ! 10: #include "is-copyright.h" ! 11: ! 12: /* font.c ! 13: * ! 14: * GetFont Takes a font name and stores it ! 15: * FreeFont Frees the storage taken by a font ! 16: * MakeFontPixmap Convert font bitmap to pixmap ! 17: * ! 18: * Copyright (c) 1986, Integrated Solutions, Inc. ! 19: */ ! 20: ! 21: #include "Xis.h" ! 22: #include "vssite.h" ! 23: #include <errno.h> ! 24: #include <sys/file.h> ! 25: ! 26: extern int errno; ! 27: ! 28: extern char *strcpy(); ! 29: extern char *strcat(); ! 30: extern long lseek(); ! 31: extern PIXMAP *MakePixmap(); ! 32: ! 33: /* ! 34: * BitMap and FontData typedefs come from ../libvs100/param.h ! 35: */ ! 36: ! 37: /* BitMap typedefs */ ! 38: typedef short a_BitmapEntryPtr[2]; ! 39: ! 40: typedef struct _Bitmap { ! 41: a_BitmapEntryPtr bm_address; ! 42: short bm_width; ! 43: short bm_height; ! 44: short bm_bitsPerPixel; ! 45: } BitMap; ! 46: ! 47: typedef short a_Bitmap[5]; ! 48: ! 49: /* FontData typedefs */ ! 50: typedef short a_FontWidthEntryPtr[2]; ! 51: ! 52: typedef struct _FontData { ! 53: a_Bitmap f_characters; ! 54: short f_firstChar; ! 55: short f_lastChar; ! 56: a_FontWidthEntryPtr f_leftArray; ! 57: short f_baseline; ! 58: short f_spaceIndex; ! 59: short f_fixedWidth; ! 60: } FontData; ! 61: ! 62: /* ! 63: * GetFont ! 64: */ ! 65: FONT *GetFont(name) ! 66: char *name; ! 67: { ! 68: char pathname[1024]; /* font pathname */ ! 69: int file; /* file descriptor */ ! 70: FontData hdr; /* font file header */ ! 71: #define chars ((BitMap *) hdr.f_characters) ! 72: int mask_size; /* size of mask bitmap */ ! 73: int xpos_size; /* size of x pos array */ ! 74: char *mask; /* character mask bitmap */ ! 75: register short *xpos; /* x position of characters in mask */ ! 76: register FONT *font; /* font */ ! 77: register FontPriv *fpriv; /* font "private" parts */ ! 78: ! 79: #ifdef DEBUG ! 80: if (debug & D_Font) ! 81: printf("GetFont(name=\"%s\")\n", name); ! 82: #endif DEBUG ! 83: ! 84: /* build pathname */ ! 85: strcpy(pathname, DEFAULT_FONT_DIRECTORY); ! 86: strcat(pathname, name); ! 87: strcat(pathname, DEFAULT_FONT_SUFFIX); ! 88: ! 89: /* open as "pathname", if open fails try "name" */ ! 90: if ((file = open(pathname, O_RDONLY, 0)) == -1 && ! 91: (errno != ENOENT || (file = open(name, O_RDONLY, 0)) == -1)) { ! 92: errno = EINVAL; ! 93: return (NULL); ! 94: } ! 95: ! 96: /* read header and swap bytes in shorts */ ! 97: if (read(file, (caddr_t) &hdr, sizeof(FontData)) != sizeof(FontData)) { ! 98: close(file); ! 99: errno = EINVAL; ! 100: return (NULL); ! 101: } ! 102: SwapShorts((short *) &hdr, sizeof(FontData)); ! 103: ! 104: /* read font mask, and swap bits in bytes */ ! 105: mask_size = BitmapSize(chars->bm_width, chars->bm_height); ! 106: mask = (char *) Xalloc(mask_size); ! 107: lseek(file, (long) hdr.f_characters[0], 0); ! 108: if (read(file, mask, mask_size) != mask_size) { ! 109: close(file); ! 110: free(mask); ! 111: errno = EINVAL; ! 112: return (NULL); ! 113: } ! 114: SwapBits((short *) mask, mask_size); ! 115: ! 116: /* read x position array */ ! 117: if (hdr.f_fixedWidth == 0) { ! 118: xpos_size = (hdr.f_lastChar - hdr.f_firstChar + 2) * sizeof(short); ! 119: xpos = (short *) Xalloc(xpos_size); ! 120: lseek(file, (long) hdr.f_leftArray[0], 0); ! 121: if (read(file, (caddr_t) xpos, xpos_size) != xpos_size) { ! 122: close(file); ! 123: free(mask); ! 124: free((caddr_t) xpos); ! 125: errno = EINVAL; ! 126: return (NULL); ! 127: } ! 128: SwapShorts(xpos, xpos_size); ! 129: } else { ! 130: xpos_size = 0; ! 131: xpos = NULL; ! 132: } ! 133: ! 134: close(file); ! 135: ! 136: /* complete "font" struct with info from file */ ! 137: font = (FONT *) Xalloc(sizeof (FONT)); ! 138: ! 139: font->name = (char *) Xalloc(strlen(name) + 1); ! 140: strcpy(font->name, name); ! 141: font->first = hdr.f_firstChar; ! 142: font->last = hdr.f_lastChar; ! 143: font->space = hdr.f_spaceIndex; ! 144: font->space += font->first; ! 145: font->height = chars->bm_height; ! 146: if (hdr.f_fixedWidth) { ! 147: font->avg_width = hdr.f_fixedWidth; ! 148: font->fixed = 1; ! 149: } else { ! 150: font->avg_width = (xpos[font->last] - xpos[font->first]) / ! 151: (font->last - font->first); ! 152: font->fixed = 0; ! 153: } ! 154: font->base = hdr.f_baseline; ! 155: font->refcnt = 1; ! 156: fpriv = (FontPriv *) Xalloc(sizeof(FontPriv)); ! 157: font->data = (caddr_t) fpriv; ! 158: ! 159: /* complete "fpriv" struct */ ! 160: { ! 161: BITMAP *bitmap = (BITMAP *) Xalloc(sizeof(BITMAP)); ! 162: RASTER *raster = (RASTER *) Xalloc(sizeof(RASTER)); ! 163: ! 164: bitmap->width = chars->bm_width; ! 165: bitmap->height = chars->bm_height; ! 166: bitmap->refcnt = 1; ! 167: bitmap->kind = (char) 0; ! 168: bitmap->data = (caddr_t) raster; ! 169: ! 170: raster->width = (short) ((chars->bm_width+15)>>4)<<1; ! 171: raster->address = (short *) mask; ! 172: ! 173: fpriv->mask = (BITMAP *) bitmap; ! 174: fpriv->xpos = xpos; ! 175: ! 176: /* if x position array exists use it to create width array */ ! 177: if (xpos) { ! 178: register short *p, *limitp; ! 179: ! 180: fpriv->widths = (short *) Xalloc (xpos_size); ! 181: ! 182: bcopy((char *)xpos, fpriv->widths, xpos_size); ! 183: ! 184: limitp = &fpriv->widths[font->last]; ! 185: for (p = &fpriv->widths[font->first]; p <= limitp; ++p) { ! 186: *p = p[1] - *p; ! 187: } ! 188: } else { ! 189: fpriv->widths = NULL; ! 190: } ! 191: } ! 192: ! 193: /* initialize font_pixmaps */ ! 194: { ! 195: register int i; ! 196: for (i=0; i<FONTPIXMAPS; ++i) { ! 197: fpriv->font_pixmaps[i].p = NULL; ! 198: } ! 199: fpriv->next_pixmap = 0; ! 200: } ! 201: ! 202: return (font); ! 203: #undef chars ! 204: } ! 205: ! 206: /* ! 207: * FreeFont ! 208: */ ! 209: FreeFont(font) ! 210: register FONT *font; ! 211: { ! 212: register FontPriv *fpriv = FDATA(font); ! 213: BITMAP *bitmap = (BITMAP *)fpriv->mask; ! 214: register RASTER *raster = (RASTER *)bitmap->data; ! 215: ! 216: #ifdef DEBUG ! 217: if (debug & D_Font) ! 218: printf("FreeFont(font=0x%x)\n", font); ! 219: #endif DEBUG ! 220: ! 221: /* free text bitmap */ ! 222: free((caddr_t) raster->address); ! 223: free((caddr_t) raster); ! 224: free((caddr_t) bitmap); ! 225: ! 226: /* free xpos and widths arrays */ ! 227: if (fpriv->xpos) { ! 228: free((caddr_t) fpriv->xpos); ! 229: free((caddr_t) fpriv->widths); ! 230: } ! 231: ! 232: /* free font pixmaps */ ! 233: { ! 234: register int i; ! 235: register struct _font_pixmaps *font_pixmaps = &fpriv->font_pixmaps[0]; ! 236: for (i = 0; i < FONTPIXMAPS; ++i, ++font_pixmaps) { ! 237: if (font_pixmaps->p) { ! 238: FreePixmap(font_pixmaps->p); ! 239: } ! 240: } ! 241: } ! 242: ! 243: /* free remainder of font data */ ! 244: free((caddr_t) fpriv); ! 245: free(font->name); ! 246: free((caddr_t) font); ! 247: } ! 248: ! 249: /* ! 250: * MakeFontPixmap ! 251: */ ! 252: PIXMAP *MakeFontPixmap(font, fore, back) ! 253: FONT *font; ! 254: register int fore, back; ! 255: { ! 256: register FontPriv *fdata = FDATA(font); ! 257: register struct _font_pixmaps *font_pixmap = &fdata->font_pixmaps[0]; ! 258: register int i; ! 259: ! 260: #ifdef DEBUG ! 261: if (debug & D_FontPixmap) ! 262: printf("MakeFontPixmap(font=0x%x, fore=%d, back=%d)\n", font, fore, back); ! 263: #endif DEBUG ! 264: ! 265: /* search font_pixmaps for match */ ! 266: for (i = 0; i < FONTPIXMAPS; ++i) { ! 267: if (font_pixmap->p && ! 268: font_pixmap->fore == fore && font_pixmap->back == back) { ! 269: /* found match */ ! 270: return (font_pixmap->p); ! 271: } ! 272: } ! 273: ! 274: /* free entry if necessary */ ! 275: font_pixmap = &fdata->font_pixmaps[fdata->next_pixmap]; ! 276: if (font_pixmap->p != NULL) { ! 277: FreePixmap(font_pixmap->p); ! 278: } ! 279: ! 280: /* create pixmap and save in font_pixmaps */ ! 281: font_pixmap->fore = fore; ! 282: font_pixmap->back = back; ! 283: font_pixmap->p = MakePixmap(fdata->mask, fore, back); ! 284: fdata->next_pixmap = (fdata->next_pixmap + 1) % FONTPIXMAPS; ! 285: ! 286: return (font_pixmap->p); ! 287: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.