|
|
1.1 root 1: #include "copyright.h"
2:
3: /* $Header: XFont.c,v 11.21 87/08/11 13:12:02 newman Exp $ */
4: /* Copyright Massachusetts Institute of Technology 1986 */
5: #define NEED_REPLIES
6: #include "Xlibint.h"
7:
8: XFontStruct *_XQueryFont();
9:
10: XFontStruct *XLoadQueryFont(dpy, name)
11: register Display *dpy;
12: char *name;
13: {
14: XFontStruct *font_result;
15: register long nbytes;
16: Font fid;
17: xOpenFontReq *req;
18:
19: LockDisplay(dpy);
20: GetReq(OpenFont, req);
21: nbytes = req->nbytes = strlen(name);
22: req->fid = fid = XAllocID(dpy);
23: req->length += (nbytes+3)>>2;
24: Data (dpy, name, nbytes);
25: dpy->request--;
26: font_result = (_XQueryFont(dpy, fid));
27: dpy->request++;
28: if (!font_result) {
29: /* if _XQueryFont returned NULL, then the OpenFont request got
30: a BadName error. This means that the following QueryFont
31: request is guaranteed to get a BadFont error, since the id
32: passed to QueryFont wasn't really a valid font id. To read
33: and discard this second error, we call _XReply again. */
34: xReply reply;
35: (void) _XReply (dpy, &reply, 0, xFalse);
36: }
37: UnlockDisplay(dpy);
38: SyncHandle();
39: return font_result;
40: }
41:
42: XFreeFont(dpy, fs)
43: register Display *dpy;
44: XFontStruct *fs;
45: {
46: register xResourceReq *req;
47: register _XExtension *ext = dpy->ext_procs;
48:
49: LockDisplay(dpy);
50: while (ext) { /* call out to any extensions interested */
51: if (ext->free_Font != NULL) (*ext->free_Font)(dpy, fs, &ext->codes);
52: ext = ext->next;
53: }
54: GetResReq (CloseFont, fs->fid, req);
55: _XFreeExtData(fs->ext_data);
56: if (fs->per_char)
57: Xfree ((char *) fs->per_char);
58: if (fs->properties)
59: Xfree ((char *) fs->properties);
60: Xfree ((char *) fs);
61: ext = dpy->ext_procs;
62: UnlockDisplay(dpy);
63: SyncHandle();
64: }
65:
66:
67: XFontStruct *_XQueryFont (dpy, fid) /* Internal-only entry point */
68: register Display *dpy;
69: Font fid;
70:
71: {
72: register XFontStruct *fs;
73: register long nbytes;
74: xQueryFontReply reply;
75: register xResourceReq *req;
76: register _XExtension *ext;
77:
78: GetResReq(QueryFont, fid, req);
79: if (!_XReply (dpy, (xReply *) &reply,
80: ((sizeof (reply) - sizeof (xReply)) >> 2), xFalse))
81: return (NULL);
82: fs = (XFontStruct *) Xmalloc (sizeof (XFontStruct));
83: fs->ext_data = NULL;
84: fs->fid = fid;
85: fs->direction = reply.drawDirection;
86: fs->min_char_or_byte2 = reply.minCharOrByte2;
87: fs->max_char_or_byte2 = reply.maxCharOrByte2;
88: fs->min_byte1 = reply.minByte1;
89: fs->max_byte1 = reply.maxByte1;
90: fs->default_char = reply.defaultChar;
91: fs->all_chars_exist = reply.allCharsExist;
92: fs->ascent = reply.fontAscent;
93: fs->descent = reply.fontDescent;
94:
95: /* XXX the next two statements won't work if short isn't 16 bits */
96:
97: fs->min_bounds = * (XCharStruct *) &reply.minBounds;
98: fs->max_bounds = * (XCharStruct *) &reply.maxBounds;
99:
100: fs->n_properties = reply.nFontProps;
101: /*
102: * if no properties defined for the font, then it is bad
103: * font, but shouldn't try to read nothing.
104: */
105: fs->properties = NULL;
106: if (fs->n_properties > 0) {
107: fs->properties = (XFontProp *) Xmalloc (
108: (unsigned)(nbytes = reply.nFontProps * sizeof (XFontProp)));
109: _XRead (dpy, (char *)fs->properties, nbytes);
110: }
111: /*
112: * If no characters in font, then it is a bad font, but
113: * shouldn't try to read nothing.
114: */
115: /* XXX may have to unpack charinfos on some machines (CRAY) */
116: fs->per_char = NULL;
117: if (reply.nCharInfos > 0){
118: fs->per_char = (XCharStruct *) Xmalloc (
119: (unsigned)(nbytes = reply.nCharInfos * sizeof (XCharStruct)));
120: _XRead (dpy, (char *)fs->per_char, nbytes);
121: }
122:
123: ext = dpy->ext_procs;
124: while (ext) { /* call out to any extensions interested */
125: if (ext->create_Font != NULL)
126: (*ext->create_Font)(dpy, fs, &ext->codes);
127: ext = ext->next;
128: }
129: return (fs);
130: }
131:
132:
133: XFontStruct *XQueryFont (dpy, fid)
134: register Display *dpy;
135: Font fid;
136: {
137: XFontStruct *font_result;
138:
139: LockDisplay(dpy);
140: font_result = _XQueryFont(dpy,fid);
141: UnlockDisplay(dpy);
142: SyncHandle();
143: return font_result;
144: }
145:
146:
147:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.