|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 6949 (0x1b25)
Types: TextFile
Names: »font.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libis/font.c«
/*
* $Source: /u1/X/libis/RCS/font.c,v $
* $Header: font.c,v 1.1 86/11/17 14:34:11 swick Rel $
*/
#ifndef lint
static char *rcsid_font_c = "$Header: font.c,v 1.1 86/11/17 14:34:11 swick Rel $";
#endif lint
#include "is-copyright.h"
/* font.c
*
* GetFont Takes a font name and stores it
* FreeFont Frees the storage taken by a font
* MakeFontPixmap Convert font bitmap to pixmap
*
* Copyright (c) 1986, Integrated Solutions, Inc.
*/
#include "Xis.h"
#include "vssite.h"
#include <errno.h>
#include <sys/file.h>
extern int errno;
extern char *strcpy();
extern char *strcat();
extern long lseek();
extern PIXMAP *MakePixmap();
/*
* BitMap and FontData typedefs come from ../libvs100/param.h
*/
/* BitMap typedefs */
typedef short a_BitmapEntryPtr[2];
typedef struct _Bitmap {
a_BitmapEntryPtr bm_address;
short bm_width;
short bm_height;
short bm_bitsPerPixel;
} BitMap;
typedef short a_Bitmap[5];
/* FontData typedefs */
typedef short a_FontWidthEntryPtr[2];
typedef struct _FontData {
a_Bitmap f_characters;
short f_firstChar;
short f_lastChar;
a_FontWidthEntryPtr f_leftArray;
short f_baseline;
short f_spaceIndex;
short f_fixedWidth;
} FontData;
/*
* GetFont
*/
FONT *GetFont(name)
char *name;
{
char pathname[1024]; /* font pathname */
int file; /* file descriptor */
FontData hdr; /* font file header */
#define chars ((BitMap *) hdr.f_characters)
int mask_size; /* size of mask bitmap */
int xpos_size; /* size of x pos array */
char *mask; /* character mask bitmap */
register short *xpos; /* x position of characters in mask */
register FONT *font; /* font */
register FontPriv *fpriv; /* font "private" parts */
#ifdef DEBUG
if (debug & D_Font)
printf("GetFont(name=\"%s\")\n", name);
#endif DEBUG
/* build pathname */
strcpy(pathname, DEFAULT_FONT_DIRECTORY);
strcat(pathname, name);
strcat(pathname, DEFAULT_FONT_SUFFIX);
/* open as "pathname", if open fails try "name" */
if ((file = open(pathname, O_RDONLY, 0)) == -1 &&
(errno != ENOENT || (file = open(name, O_RDONLY, 0)) == -1)) {
errno = EINVAL;
return (NULL);
}
/* read header and swap bytes in shorts */
if (read(file, (caddr_t) &hdr, sizeof(FontData)) != sizeof(FontData)) {
close(file);
errno = EINVAL;
return (NULL);
}
SwapShorts((short *) &hdr, sizeof(FontData));
/* read font mask, and swap bits in bytes */
mask_size = BitmapSize(chars->bm_width, chars->bm_height);
mask = (char *) Xalloc(mask_size);
lseek(file, (long) hdr.f_characters[0], 0);
if (read(file, mask, mask_size) != mask_size) {
close(file);
free(mask);
errno = EINVAL;
return (NULL);
}
SwapBits((short *) mask, mask_size);
/* read x position array */
if (hdr.f_fixedWidth == 0) {
xpos_size = (hdr.f_lastChar - hdr.f_firstChar + 2) * sizeof(short);
xpos = (short *) Xalloc(xpos_size);
lseek(file, (long) hdr.f_leftArray[0], 0);
if (read(file, (caddr_t) xpos, xpos_size) != xpos_size) {
close(file);
free(mask);
free((caddr_t) xpos);
errno = EINVAL;
return (NULL);
}
SwapShorts(xpos, xpos_size);
} else {
xpos_size = 0;
xpos = NULL;
}
close(file);
/* complete "font" struct with info from file */
font = (FONT *) Xalloc(sizeof (FONT));
font->name = (char *) Xalloc(strlen(name) + 1);
strcpy(font->name, name);
font->first = hdr.f_firstChar;
font->last = hdr.f_lastChar;
font->space = hdr.f_spaceIndex;
font->space += font->first;
font->height = chars->bm_height;
if (hdr.f_fixedWidth) {
font->avg_width = hdr.f_fixedWidth;
font->fixed = 1;
} else {
font->avg_width = (xpos[font->last] - xpos[font->first]) /
(font->last - font->first);
font->fixed = 0;
}
font->base = hdr.f_baseline;
font->refcnt = 1;
fpriv = (FontPriv *) Xalloc(sizeof(FontPriv));
font->data = (caddr_t) fpriv;
/* complete "fpriv" struct */
{
BITMAP *bitmap = (BITMAP *) Xalloc(sizeof(BITMAP));
RASTER *raster = (RASTER *) Xalloc(sizeof(RASTER));
bitmap->width = chars->bm_width;
bitmap->height = chars->bm_height;
bitmap->refcnt = 1;
bitmap->kind = (char) 0;
bitmap->data = (caddr_t) raster;
raster->width = (short) ((chars->bm_width+15)>>4)<<1;
raster->address = (short *) mask;
fpriv->mask = (BITMAP *) bitmap;
fpriv->xpos = xpos;
/* if x position array exists use it to create width array */
if (xpos) {
register short *p, *limitp;
fpriv->widths = (short *) Xalloc (xpos_size);
bcopy((char *)xpos, fpriv->widths, xpos_size);
limitp = &fpriv->widths[font->last];
for (p = &fpriv->widths[font->first]; p <= limitp; ++p) {
*p = p[1] - *p;
}
} else {
fpriv->widths = NULL;
}
}
/* initialize font_pixmaps */
{
register int i;
for (i=0; i<FONTPIXMAPS; ++i) {
fpriv->font_pixmaps[i].p = NULL;
}
fpriv->next_pixmap = 0;
}
return (font);
#undef chars
}
/*
* FreeFont
*/
FreeFont(font)
register FONT *font;
{
register FontPriv *fpriv = FDATA(font);
BITMAP *bitmap = (BITMAP *)fpriv->mask;
register RASTER *raster = (RASTER *)bitmap->data;
#ifdef DEBUG
if (debug & D_Font)
printf("FreeFont(font=0x%x)\n", font);
#endif DEBUG
/* free text bitmap */
free((caddr_t) raster->address);
free((caddr_t) raster);
free((caddr_t) bitmap);
/* free xpos and widths arrays */
if (fpriv->xpos) {
free((caddr_t) fpriv->xpos);
free((caddr_t) fpriv->widths);
}
/* free font pixmaps */
{
register int i;
register struct _font_pixmaps *font_pixmaps = &fpriv->font_pixmaps[0];
for (i = 0; i < FONTPIXMAPS; ++i, ++font_pixmaps) {
if (font_pixmaps->p) {
FreePixmap(font_pixmaps->p);
}
}
}
/* free remainder of font data */
free((caddr_t) fpriv);
free(font->name);
free((caddr_t) font);
}
/*
* MakeFontPixmap
*/
PIXMAP *MakeFontPixmap(font, fore, back)
FONT *font;
register int fore, back;
{
register FontPriv *fdata = FDATA(font);
register struct _font_pixmaps *font_pixmap = &fdata->font_pixmaps[0];
register int i;
#ifdef DEBUG
if (debug & D_FontPixmap)
printf("MakeFontPixmap(font=0x%x, fore=%d, back=%d)\n", font, fore, back);
#endif DEBUG
/* search font_pixmaps for match */
for (i = 0; i < FONTPIXMAPS; ++i) {
if (font_pixmap->p &&
font_pixmap->fore == fore && font_pixmap->back == back) {
/* found match */
return (font_pixmap->p);
}
}
/* free entry if necessary */
font_pixmap = &fdata->font_pixmaps[fdata->next_pixmap];
if (font_pixmap->p != NULL) {
FreePixmap(font_pixmap->p);
}
/* create pixmap and save in font_pixmaps */
font_pixmap->fore = fore;
font_pixmap->back = back;
font_pixmap->p = MakePixmap(fdata->mask, fore, back);
fdata->next_pixmap = (fdata->next_pixmap + 1) % FONTPIXMAPS;
return (font_pixmap->p);
}