|
|
1.1 root 1: #include "copyright.h"
2:
3: /* $Header: XText16.c,v 11.15 87/08/29 13:46:55 newman Locked $ */
4: /* Copyright Massachusetts Institute of Technology 1986 */
5:
6: #include "Xlibint.h"
7:
8: XDrawString16(dpy, d, gc, x, y, string, length)
9: register Display *dpy;
10: Drawable d;
11: GC gc;
12: int x, y;
13: XChar2b *string;
14: int length;
15: {
16: int Datalength = 0;
17: register xPolyText16Req *req;
18:
19: if (length <= 0)
20: return;
21:
22: LockDisplay(dpy);
23: FlushGC(dpy, gc);
24: GetReq (PolyText16, req);
25: req->drawable = d;
26: req->gc = gc->gid;
27: req->x = x;
28: req->y = y;
29:
30:
31: Datalength += sizeof(xTextElt) * ((length + 253) / 254) + (length << 1);
32:
33:
34: req->length += (Datalength + 3)>>2; /* convert to number of 32-bit words */
35:
36:
37: /*
38: * If the entire request does not fit into the remaining space in the
39: * buffer, flush the buffer first. If the request does fit into the
40: * empty buffer, then we won't have to flush it at the end to keep
41: * the buffer 32-bit aligned.
42: */
43:
44: if (dpy->bufptr + Datalength > dpy->bufmax)
45: _XFlush (dpy);
46:
47: {
48: int nbytes;
49: int PartialNChars = length;
50: register xTextElt *elt;
51: XChar2b *CharacterOffset = string;
52:
53: while(PartialNChars > 254)
54: {
55: nbytes = 254 * 2 + sizeof(xTextElt);
56: BufAlloc (xTextElt *, elt, nbytes);
57: elt->delta = 0;
58: elt->len = 254;
59: bcopy ((char *)CharacterOffset, (char *) (elt + 1), 254 * 2);
60: PartialNChars = PartialNChars - 254;
61: CharacterOffset += 254;
62: }
63:
64: if (PartialNChars)
65: {
66: nbytes = PartialNChars * 2 + sizeof(xTextElt);
67: BufAlloc (xTextElt *, elt, nbytes);
68: elt->delta = 0;
69: elt->len = PartialNChars;
70: bcopy ((char *)CharacterOffset, (char *) (elt + 1), PartialNChars * 2);
71: }
72: }
73:
74: /* Pad request out to a 32-bit boundary */
75:
76: if (Datalength &= 3) {
77: char *pad;
78: /*
79: * BufAlloc is a macro that uses its last argument more than
80: * once, otherwise I'd write "BufAlloc (char *, pad, 4-length)"
81: */
82: length = 4 - Datalength;
83: BufAlloc (char *, pad, length);
84: /*
85: * if there are 3 bytes of padding, the first byte MUST be 0
86: * so the pad bytes aren't mistaken for a final xTextElt
87: */
88: *pad = 0;
89: }
90:
91: /*
92: * If the buffer pointer is not now pointing to a 32-bit boundary,
93: * we must flush the buffer so that it does point to a 32-bit boundary
94: * at the end of this routine.
95: */
96:
97: if ((dpy->bufptr - dpy->buffer) & 3)
98: _XFlush (dpy);
99: UnlockDisplay(dpy);
100: SyncHandle();
101: return;
102: }
103:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.