1: /* $Header: font.c,v 10.3 86/02/01 15:46:53 tony Rel $ */
2: /* font.c Reads a font from a file and stores it on the workstation
3: *
4: * GetFont Takes a font name and stores it
5: * FreeFont Frees the storage taken by a font
6: *
7: */
8:
9: /****************************************************************************
10: * *
11: * Copyright (c) 1983, 1984 by *
12: * DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
13: * All rights reserved. *
14: * *
15: * This software is furnished on an as-is basis and may be used and copied *
16: * only with inclusion of the above copyright notice. This software or any *
17: * other copies thereof may be provided or otherwise made available to *
18: * others only for non-commercial purposes. No title to or ownership of *
19: * the software is hereby transferred. *
20: * *
21: * The information in this software is subject to change without notice *
22: * and should not be construed as a commitment by DIGITAL EQUIPMENT *
23: * CORPORATION. *
24: * *
25: * DIGITAL assumes no responsibility for the use or reliability of its *
26: * software on equipment which is not supplied by DIGITAL. *
27: * *
28: * *
29: ****************************************************************************/
30:
31: #include "vs100.h"
32: #include "vssite.h"
33: #include <errno.h>
34:
35: extern int errno;
36:
37: char *Xalloc(), *AllocateSpace(), *strcpy(), *strcat();
38: long lseek();
39: VSArea *VSAlloc();
40:
41: FONT *GetFont (name)
42: char *name;
43: {
44: char fontname[256];
45: int fontfile;
46: FontData font;
47: register FontData *fontCopy;
48: #define chars ((BitMap *) font.f_characters)
49: int fontsize, leftsize, width;
50: char *fontarea;
51: register short *leftarea;
52: register FONT *fd;
53: FontPriv *fpriv;
54: register BitMap *mychars;
55:
56: strcpy (fontname, DEFAULT_FONT_DIRECTORY);
57: strcat (fontname, name);
58: strcat (fontname, DEFAULT_FONT_SUFFIX);
59:
60: if ((fontfile = open (fontname, 0)) == -1 &&
61: (errno != ENOENT || (fontfile = open (name, 0)) == -1)) {
62: errno = EINVAL;
63: return (NULL);
64: }
65:
66: if (read (fontfile, (caddr_t) &font, sizeof (FontData)) != sizeof (FontData)) {
67: close (fontfile);
68: errno = EINVAL;
69: return (NULL);
70: }
71:
72: fontsize = BitmapSize(chars->bm_width, chars->bm_height);
73: fontarea = (char *) Xalloc (fontsize);
74: lseek (fontfile, (long) font.f_characters[0], 0);
75: if (read (fontfile, fontarea, fontsize) != fontsize) {
76: close (fontfile);
77: free (fontarea);
78: errno = EINVAL;
79: return (NULL);
80: }
81:
82: if (font.f_fixedWidth == 0) {
83: leftsize = (font.f_lastChar - font.f_firstChar + 2) * sizeof (short);
84: leftarea = (short *) Xalloc (leftsize);
85: lseek (fontfile, (long) font.f_leftArray[0], 0);
86: if (read (fontfile, (caddr_t) leftarea, leftsize) != leftsize) {
87: close (fontfile);
88: free (fontarea);
89: free ((caddr_t) leftarea);
90: errno = EINVAL;
91: return (NULL);
92: }
93: } else {
94: leftsize = 0;
95: leftarea = NULL;
96: }
97:
98: close (fontfile);
99:
100: if ((fontCopy = (FontData *)
101: AllocateSpace (sizeof (FontData))) == NULL) {
102: free (fontarea);
103: if (leftarea)
104: free ((caddr_t) leftarea);
105: errno = ENOMEM;
106: return (NULL);
107: }
108: mychars = (BitMap *) fontCopy->f_characters;
109: fd = (FONT *) Xalloc (sizeof (FONT));
110:
111: mychars->bm_address[0] = sizeof (FontData);
112: mychars->bm_address[1] = 0;
113: mychars->bm_width = chars->bm_width;
114: fd->height = mychars->bm_height = chars->bm_height;
115: mychars->bm_bitsPerPixel = 1;
116: fd->first = fontCopy->f_firstChar = font.f_firstChar;
117: fd->last = fontCopy->f_lastChar = font.f_lastChar;
118: if (leftarea)
119: fontCopy->f_leftArray[0] = sizeof (FontData) + fontsize;
120: else
121: fontCopy->f_leftArray[0] = 0;
122: fontCopy->f_leftArray[1] = 0;
123:
124: fd->base = fontCopy->f_baseline = font.f_baseline;
125: fd->space = fontCopy->f_spaceIndex = font.f_spaceIndex;
126: fd->space += fd->first;
127: if (fd->avg_width = fontCopy->f_fixedWidth = font.f_fixedWidth)
128: fd->fixed = 1;
129: else
130: fd->fixed = 0;
131:
132: fd->refcnt = 1;
133: fpriv = (FontPriv *) Xalloc (sizeof (FontPriv));
134: fd->data = (caddr_t) fpriv;
135: fpriv->widths = leftarea;
136:
137: if ((fpriv->remote = (VSArea *) VSAlloc (sizeof (FontData) + fontsize + leftsize,
138: FONT_TYPE)) == NULL) {
139: free (fontarea);
140: if (leftarea)
141: free ((caddr_t) leftarea);
142: free ((caddr_t) fd);
143: free ((caddr_t) fpriv);
144: return (NULL);
145: }
146: fd->name = (char *) Xalloc (strlen (name) + 1);
147: strcpy (fd->name, name);
148:
149: if (MoveObjectDown ((caddr_t) fontCopy, fpriv->remote->vsPtr, sizeof (FontData)) ||
150: MoveBufferDown (fontarea,
151: fpriv->remote->vsPtr + sizeof (FontData),
152: fontsize) ||
153: (leftarea &&
154: MoveBufferDown ((caddr_t) leftarea,
155: fpriv->remote->vsPtr + sizeof (FontData) + fontsize,
156: leftsize))) {
157: free (fontarea);
158: FreeFont (fd);
159: errno = ENOMEM;
160: return (NULL);
161: }
162:
163: if (leftarea) {
164: leftsize = font.f_lastChar - font.f_firstChar + 1;
165: width = 0;
166: fontsize = 0;
167: while (--leftsize >= 0) {
168: *leftarea = leftarea[1] - *leftarea;
169: if (*leftarea) {
170: width += *leftarea;
171: fontsize++;
172: }
173: leftarea++;
174: }
175: fd->avg_width = width / fontsize;
176: }
177: free (fontarea);
178: return (fd);
179: #undef chars
180: }
181:
182: FreeFont (font)
183: register FONT *font;
184: {
185: register FontPriv *data;
186:
187: data = FDATA(font);
188: if (data->widths) free ((caddr_t) data->widths);
189: VSFree (data->remote);
190: free ((caddr_t) data);
191: free (font->name);
192: free ((caddr_t) font);
193: }
Defined functions
Defined macros
chars
defined in line
48; used 5 times