summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-13 15:12:25 -0800
committerKeith Packard <keithp@keithp.com>2017-12-13 15:12:25 -0800
commit47f7a02d687f8ec426ab6a618be70bc3fdf44a21 (patch)
tree2ae59bcfeddff010635bff10ed8909ab4cd1d252
parent6717e6c1f6fc19e132ff1e306674accece96f25b (diff)
parentd69de204e55ab5099e34d7afe95ca7bda0a30c22 (diff)
Merge fontsproto
-rw-r--r--.gitignore78
-rw-r--r--COPYING86
-rw-r--r--FS.h129
-rw-r--r--FSproto.h814
-rw-r--r--Makefile.am26
-rw-r--r--README25
-rwxr-xr-xautogen.sh17
-rw-r--r--configure.ac20
-rw-r--r--docbook.am105
-rw-r--r--font.h168
-rw-r--r--fontproto.h94
-rw-r--r--fontsproto.pc.in9
-rw-r--r--fontstruct.h297
-rw-r--r--fsmasks.h97
-rw-r--r--specs/.gitignore5
-rw-r--r--specs/Makefile.am13
-rw-r--r--specs/fsproto.xml4417
17 files changed, 6400 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f1ca084
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,78 @@
+#
+# X.Org module default exclusion patterns
+# The next section if for module specific patterns
+#
+# Do not edit the following section
+# GNU Build System (Autotools)
+aclocal.m4
+autom4te.cache/
+autoscan.log
+ChangeLog
+compile
+config.guess
+config.h
+config.h.in
+config.log
+config-ml.in
+config.py
+config.status
+config.status.lineno
+config.sub
+configure
+configure.scan
+depcomp
+.deps/
+INSTALL
+install-sh
+.libs/
+libtool
+libtool.m4
+ltmain.sh
+lt~obsolete.m4
+ltoptions.m4
+ltsugar.m4
+ltversion.m4
+Makefile
+Makefile.in
+mdate-sh
+missing
+mkinstalldirs
+*.pc
+py-compile
+stamp-h?
+symlink-tree
+texinfo.tex
+ylwrap
+
+# Do not edit the following section
+# Edit Compile Debug Document Distribute
+*~
+*.[0-9]
+*.[0-9]x
+*.bak
+*.bin
+core
+*.dll
+*.exe
+*-ISO*.bdf
+*-JIS*.bdf
+*-KOI8*.bdf
+*.kld
+*.ko
+*.ko.cmd
+*.lai
+*.l[oa]
+*.[oa]
+*.obj
+*.patch
+*.so
+*.pcf.gz
+*.pdb
+*.tar.bz2
+*.tar.gz
+#
+# Add & Override patterns for fontsproto
+#
+# Edit the following section as needed
+# For example, !report.pc overrides *.pc. See 'man gitignore'
+#
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..eac45aa
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,86 @@
+Copyright 1990, 1991 Network Computing Devices;
+Portions Copyright 1987 by Digital Equipment Corporation
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation for any purpose is hereby granted without fee, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the names of Network Computing Devices or Digital
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+Network Computing Devices and Digital make no representations
+about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+
+NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES
+OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+
+Copyright 1990, 1991, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+
+Copyright (c) 1999 The XFree86 Project Inc.
+
+All Rights Reserved.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The XFree86 Project
+Inc. shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from The XFree86 Project Inc..
diff --git a/FS.h b/FS.h
new file mode 100644
index 0000000..605b5a8
--- /dev/null
+++ b/FS.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices or Digital
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.
+ * Network Computing Devices and Digital make no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES
+ * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+
+/*
+
+Portions Copyright 1987, 1994, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+#ifndef _FS_H_
+#define _FS_H_
+
+#include <X11/Xdefs.h>
+#include <X11/fonts/fsmasks.h>
+
+#define FS_PROTOCOL 2
+#define FS_PROTOCOL_MINOR 0
+
+#ifndef X_PROTOCOL
+/* protocol familes */
+#define FamilyInternet 0
+#define FamilyDECnet 1
+#define FamilyChaos 2
+#define FamilyInternet6 6
+
+
+typedef unsigned int FSDrawDirection;
+#endif
+
+#ifndef None
+#define None 0L
+#endif
+
+#define LeftToRightDrawDirection 0
+#define RightToLeftDrawDirection 1
+
+/* font info flags */
+#define FontInfoAllCharsExist (1L << 0)
+#define FontInfoInkInside (1L << 1)
+#define FontInfoHorizontalOverlap (1L << 2)
+
+/* auth status flags */
+#define AuthSuccess 0
+#define AuthContinue 1
+#define AuthBusy 2
+#define AuthDenied 3
+
+/* property types */
+#define PropTypeString 0
+#define PropTypeUnsigned 1
+#define PropTypeSigned 2
+
+#ifndef LSBFirst
+/* byte order */
+#define LSBFirst 0
+#define MSBFirst 1
+#endif
+
+/* event masks */
+#define CatalogueChangeNotifyMask (1L << 0)
+#define FontChangeNotifyMask (1L << 1)
+
+/* errors */
+#define FSSuccess -1
+#define FSBadRequest 0
+#define FSBadFormat 1
+#define FSBadFont 2
+#define FSBadRange 3
+#define FSBadEventMask 4
+#define FSBadAccessContext 5
+#define FSBadIDChoice 6
+#define FSBadName 7
+#define FSBadResolution 8
+#define FSBadAlloc 9
+#define FSBadLength 10
+#define FSBadImplementation 11
+
+#define FirstExtensionError 128
+#define LastExtensionError 255
+
+/* events */
+#define KeepAlive 0
+#define CatalogueChangeNotify 1
+#define FontChangeNotify 2
+#define FSLASTEvent 3
+
+#endif /* _FS_H_ */
diff --git a/FSproto.h b/FSproto.h
new file mode 100644
index 0000000..028156f
--- /dev/null
+++ b/FSproto.h
@@ -0,0 +1,814 @@
+/*
+
+Copyright 1990, 1991, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices, or Digital
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES, AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES,
+ * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+
+#ifndef _FS_PROTO_H_
+#define _FS_PROTO_H_
+
+#include <X11/fonts/FS.h>
+
+#define sz_fsPropOffset 20
+#define sz_fsPropInfo 8
+#define sz_fsResolution 6
+
+#define sz_fsChar2b 2
+#define sz_fsChar2b_version1 2
+#define sz_fsOffset32 8
+#define sz_fsRange 4
+
+#define sz_fsXCharInfo 12
+#define sz_fsXFontInfoHeader 40
+
+#define sz_fsConnClientPrefix 8
+#define sz_fsConnSetup 12
+#define sz_fsConnSetupExtra 8
+#define sz_fsConnSetupAccept 12
+
+/* request sizes */
+#define sz_fsReq 4
+#define sz_fsListExtensionsReq 4
+#define sz_fsResourceReq 8
+
+#define sz_fsNoopReq 4
+#define sz_fsListExtensionReq 4
+#define sz_fsQueryExtensionReq 4
+#define sz_fsListCataloguesReq 12
+#define sz_fsSetCataloguesReq 4
+#define sz_fsGetCataloguesReq 4
+#define sz_fsSetEventMaskReq 8
+#define sz_fsGetEventMaskReq 4
+#define sz_fsCreateACReq 8
+#define sz_fsFreeACReq 8
+#define sz_fsSetAuthorizationReq 8
+#define sz_fsSetResolutionReq 4
+#define sz_fsGetResolutionReq 4
+#define sz_fsListFontsReq 12
+#define sz_fsListFontsWithXInfoReq 12
+#define sz_fsOpenBitmapFontReq 16
+#define sz_fsQueryXInfoReq 8
+#define sz_fsQueryXExtents8Req 12
+#define sz_fsQueryXExtents16Req 12
+#define sz_fsQueryXBitmaps8Req 16
+#define sz_fsQueryXBitmaps16Req 16
+#define sz_fsCloseReq 8
+
+/* reply sizes */
+#define sz_fsReply 8
+#define sz_fsGenericReply 8
+
+#define sz_fsListExtensionsReply 8
+#define sz_fsQueryExtensionReply 20
+#define sz_fsListCataloguesReply 16
+#define sz_fsGetCataloguesReply 8
+#define sz_fsGetEventMaskReply 12
+#define sz_fsCreateACReply 12
+#define sz_fsGetResolutionReply 8
+#define sz_fsListFontsReply 16
+#define sz_fsListFontsWithXInfoReply (12 + sz_fsXFontInfoHeader)
+#define sz_fsOpenBitmapFontReply 16
+#define sz_fsQueryXInfoReply (8 + sz_fsXFontInfoHeader)
+#define sz_fsQueryXExtents8Reply 12
+#define sz_fsQueryXExtents16Reply 12
+#define sz_fsQueryXBitmaps8Reply 20
+#define sz_fsQueryXBitmaps16Reply 20
+
+#define sz_fsError 16
+#define sz_fsEvent 12
+#define sz_fsKeepAliveEvent 12
+
+#define fsTrue 1
+#define fsFalse 0
+
+/* temp decls */
+#define Mask CARD32
+#define Font CARD32
+#define AccContext CARD32
+
+typedef CARD32 fsTimestamp;
+
+#ifdef NOTDEF /* in fsmasks.h */
+typedef CARD32 fsBitmapFormat;
+typedef CARD32 fsBitmapFormatMask;
+#endif
+
+#define sz_fsBitmapFormat 4
+
+typedef struct {
+ INT16 left B16,
+ right B16;
+ INT16 width B16;
+ INT16 ascent B16,
+ descent B16;
+ CARD16 attributes B16;
+} fsXCharInfo;
+
+typedef struct {
+ CARD8 high;
+ CARD8 low;
+} fsChar2b;
+
+typedef struct {
+ CARD8 low;
+ CARD8 high;
+} fsChar2b_version1;
+
+typedef struct {
+ CARD8 min_char_high;
+ CARD8 min_char_low;
+ CARD8 max_char_high;
+ CARD8 max_char_low;
+} fsRange;
+
+typedef struct {
+ CARD32 position B32;
+ CARD32 length B32;
+} fsOffset32;
+
+typedef struct {
+ fsOffset32 name;
+ fsOffset32 value;
+ CARD8 type;
+ BYTE pad0;
+ CARD16 pad1 B16;
+} fsPropOffset;
+
+typedef struct {
+ CARD32 num_offsets B32;
+ CARD32 data_len B32;
+ /* offsets */
+ /* data */
+} fsPropInfo;
+
+typedef struct {
+ CARD16 x_resolution B16;
+ CARD16 y_resolution B16;
+ CARD16 point_size B16;
+} fsResolution;
+
+
+typedef struct {
+ CARD32 flags B32;
+ CARD8 char_range_min_char_high;
+ CARD8 char_range_min_char_low;
+ CARD8 char_range_max_char_high;
+ CARD8 char_range_max_char_low;
+
+ CARD8 draw_direction;
+ CARD8 pad;
+ CARD8 default_char_high;
+ CARD8 default_char_low;
+ INT16 min_bounds_left B16;
+ INT16 min_bounds_right B16;
+
+ INT16 min_bounds_width B16;
+ INT16 min_bounds_ascent B16;
+ INT16 min_bounds_descent B16;
+ CARD16 min_bounds_attributes B16;
+
+ INT16 max_bounds_left B16;
+ INT16 max_bounds_right B16;
+ INT16 max_bounds_width B16;
+ INT16 max_bounds_ascent B16;
+
+ INT16 max_bounds_descent B16;
+ CARD16 max_bounds_attributes B16;
+ INT16 font_ascent B16;
+ INT16 font_descent B16;
+ /* propinfo */
+} fsXFontInfoHeader;
+
+
+/* requests */
+
+typedef struct {
+ BYTE byteOrder;
+ CARD8 num_auths;
+ CARD16 major_version B16;
+ CARD16 minor_version B16;
+ CARD16 auth_len B16;
+ /* auth data */
+} fsConnClientPrefix;
+
+typedef struct {
+ CARD16 status B16;
+ CARD16 major_version B16;
+ CARD16 minor_version B16;
+ CARD8 num_alternates;
+ CARD8 auth_index;
+ CARD16 alternate_len B16;
+ CARD16 auth_len B16;
+ /* alternates */
+ /* auth data */
+} fsConnSetup;
+
+typedef struct {
+ CARD32 length B32;
+ CARD16 status B16;
+ CARD16 pad B16;
+ /* more auth data */
+} fsConnSetupExtra;
+
+typedef struct {
+ CARD32 length B32;
+ CARD16 max_request_len B16;
+ CARD16 vendor_len B16;
+ CARD32 release_number B32;
+ /* vendor string */
+} fsConnSetupAccept;
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 data;
+ CARD16 length B16;
+} fsReq;
+
+/*
+ * The fsFakeReq structure is never used in the protocol; it is prepended
+ * to incoming packets when setting up a connection so we can index
+ * through InitialVector. To avoid alignment problems, it is padded
+ * to the size of a word on the largest machine this code runs on.
+ * Hence no sz_fsFakeReq constant is necessary.
+ */
+typedef struct {
+ CARD8 reqType;
+ CARD8 data;
+ CARD16 length B16;
+ CARD32 pad B32; /* to fill out to multiple of 64 bits */
+} fsFakeReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE pad;
+ CARD16 length B16;
+ Font id B32;
+} fsResourceReq;
+
+typedef fsReq fsNoopReq;
+typedef fsReq fsListExtensionsReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE nbytes;
+ CARD16 length B16;
+ /* name */
+} fsQueryExtensionReq;
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 data;
+ CARD16 length B16;
+ CARD32 maxNames B32;
+ CARD16 nbytes B16;
+ CARD16 pad2 B16;
+ /* pattern */
+} fsListCataloguesReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE num_catalogues;
+ CARD16 length B16;
+ /* catalogues */
+} fsSetCataloguesReq;
+
+typedef fsReq fsGetCataloguesReq;
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 ext_opcode;
+ CARD16 length B16;
+ Mask event_mask;
+} fsSetEventMaskReq;
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 ext_opcode;
+ CARD16 length B16;
+} fsGetEventMaskReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE num_auths;
+ CARD16 length B16;
+ AccContext acid B32;
+ /* auth protocols */
+} fsCreateACReq;
+
+typedef fsResourceReq fsFreeACReq;
+typedef fsResourceReq fsSetAuthorizationReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE num_resolutions;
+ CARD16 length B16;
+ /* resolutions */
+} fsSetResolutionReq;
+
+typedef fsReq fsGetResolutionReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE pad;
+ CARD16 length B16;
+ CARD32 maxNames B32;
+ CARD16 nbytes B16;
+ CARD16 pad2 B16;
+ /* pattern */
+} fsListFontsReq;
+
+typedef fsListFontsReq fsListFontsWithXInfoReq;
+
+typedef struct {
+ CARD8 reqType;
+ BYTE pad;
+ CARD16 length B16;
+ Font fid B32;
+ fsBitmapFormatMask format_mask B32;
+ fsBitmapFormat format_hint B32;
+ /* pattern */
+} fsOpenBitmapFontReq;
+
+typedef fsResourceReq fsQueryXInfoReq;
+
+typedef struct {
+ CARD8 reqType;
+ BOOL range;
+ CARD16 length B16;
+ Font fid B32;
+ CARD32 num_ranges B32;
+ /* list of chars */
+} fsQueryXExtents8Req;
+
+typedef fsQueryXExtents8Req fsQueryXExtents16Req;
+
+typedef struct {
+ CARD8 reqType;
+ BOOL range;
+ CARD16 length B16;
+ Font fid B32;
+ fsBitmapFormat format B32;
+ CARD32 num_ranges B32;
+ /* list of chars */
+} fsQueryXBitmaps8Req;
+
+typedef fsQueryXBitmaps8Req fsQueryXBitmaps16Req;
+
+typedef fsResourceReq fsCloseReq;
+
+
+/* replies */
+typedef struct {
+ BYTE type;
+ BYTE data1;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+} fsGenericReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 nExtensions;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ /* extension names */
+} fsListExtensionsReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 present;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD16 major_version B16;
+ CARD16 minor_version B16;
+ CARD8 major_opcode;
+ CARD8 first_event;
+ CARD8 num_events;
+ CARD8 first_error;
+ CARD8 num_errors;
+ CARD8 pad1;
+ CARD16 pad2 B16;
+} fsQueryExtensionReply;
+
+typedef struct {
+ BYTE type;
+ BYTE pad;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_replies B32;
+ CARD32 num_catalogues B32;
+ /* catalog names */
+} fsListCataloguesReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 num_catalogues;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ /* catalogue names */
+} fsGetCataloguesReply;
+
+typedef struct {
+ BYTE type;
+ BYTE pad1;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 event_mask B32;
+} fsGetEventMaskReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 auth_index;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD16 status B16;
+ CARD16 pad B16;
+ /* auth data */
+} fsCreateACReply;
+
+typedef struct {
+ CARD32 length B32;
+ CARD16 status B16;
+ CARD16 pad B16;
+ /* auth data */
+} fsCreateACExtraReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 num_resolutions;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ /* resolutions */
+} fsGetResolutionReply;
+
+typedef struct {
+ BYTE type;
+ BYTE pad1;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 following B32;
+ CARD32 nFonts B32;
+ /* font names */
+} fsListFontsReply;
+
+/*
+ * this one is messy. the reply itself is variable length (unknown
+ * number of replies) and the contents of each is variable (unknown
+ * number of properties)
+ *
+ */
+
+typedef struct {
+ BYTE type;
+ CARD8 nameLength; /* 0 is end-of-reply */
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 nReplies B32;
+ CARD32 font_header_flags B32;
+ CARD8 font_hdr_char_range_min_char_high;
+ CARD8 font_hdr_char_range_min_char_low;
+ CARD8 font_hdr_char_range_max_char_high;
+ CARD8 font_hdr_char_range_max_char_low;
+ CARD8 font_header_draw_direction;
+ CARD8 font_header_pad;
+ CARD8 font_header_default_char_high;
+ CARD8 font_header_default_char_low;
+ INT16 font_header_min_bounds_left B16;
+ INT16 font_header_min_bounds_right B16;
+ INT16 font_header_min_bounds_width B16;
+ INT16 font_header_min_bounds_ascent B16;
+ INT16 font_header_min_bounds_descent B16;
+ CARD16 font_header_min_bounds_attributes B16;
+ INT16 font_header_max_bounds_left B16;
+ INT16 font_header_max_bounds_right B16;
+ INT16 font_header_max_bounds_width B16;
+ INT16 font_header_max_bounds_ascent B16;
+ INT16 font_header_max_bounds_descent B16;
+ CARD16 font_header_max_bounds_attributes B16;
+ INT16 font_header_font_ascent B16;
+ INT16 font_header_font_descent B16;
+ /* propinfo */
+ /* name */
+} fsListFontsWithXInfoReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 otherid_valid;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 otherid B32;
+ BYTE cachable;
+ BYTE pad1;
+ CARD16 pad2 B16;
+} fsOpenBitmapFontReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 font_header_flags B32;
+ CARD8 font_hdr_char_range_min_char_high;
+ CARD8 font_hdr_char_range_min_char_low;
+ CARD8 font_hdr_char_range_max_char_high;
+ CARD8 font_hdr_char_range_max_char_low;
+ CARD8 font_header_draw_direction;
+ CARD8 font_header_pad;
+ CARD8 font_header_default_char_high;
+ CARD8 font_header_default_char_low;
+ INT16 font_header_min_bounds_left B16;
+ INT16 font_header_min_bounds_right B16;
+ INT16 font_header_min_bounds_width B16;
+ INT16 font_header_min_bounds_ascent B16;
+ INT16 font_header_min_bounds_descent B16;
+ CARD16 font_header_min_bounds_attributes B16;
+ INT16 font_header_max_bounds_left B16;
+ INT16 font_header_max_bounds_right B16;
+ INT16 font_header_max_bounds_width B16;
+ INT16 font_header_max_bounds_ascent B16;
+ INT16 font_header_max_bounds_descent B16;
+ CARD16 font_header_max_bounds_attributes B16;
+ INT16 font_header_font_ascent B16;
+ INT16 font_header_font_descent B16;
+ /* propinfo */
+} fsQueryXInfoReply;
+
+typedef struct {
+ BYTE type;
+ CARD8 pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_extents B32;
+ /* extents */
+} fsQueryXExtents8Reply;
+
+typedef fsQueryXExtents8Reply fsQueryXExtents16Reply;
+
+typedef struct {
+ BYTE type;
+ CARD8 pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 replies_hint B32;
+ CARD32 num_chars B32;
+ CARD32 nbytes B32;
+ /* offsets */
+ /* glyphs */
+} fsQueryXBitmaps8Reply;
+
+typedef fsQueryXBitmaps8Reply fsQueryXBitmaps16Reply;
+
+typedef union {
+ fsGenericReply generic;
+ fsListExtensionsReply extensions;
+ fsGetResolutionReply getres;
+} fsReply;
+
+/* errors */
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+} fsError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+} fsRequestError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ fsBitmapFormat format B32;
+} fsFormatError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ Font fontid;
+} fsFontError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ fsRange range;
+} fsRangeError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ Mask event_mask;
+} fsEventMaskError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ AccContext acid;
+} fsAccessContextError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ Font fontid;
+} fsIDChoiceError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+} fsNameError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ fsResolution resolution;
+} fsResolutionError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+} fsAllocError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+ CARD32 bad_length B32;
+} fsLengthError;
+
+typedef struct {
+ BYTE type;
+ BYTE request;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ CARD8 major_opcode;
+ CARD8 minor_opcode;
+ CARD16 pad B16;
+} fsImplementationError;
+
+/* events */
+typedef struct {
+ BYTE type;
+ BYTE event_code;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+} fsKeepAliveEvent;
+
+typedef struct {
+ BYTE type;
+ BYTE event_code;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ fsTimestamp timestamp;
+ BOOL added;
+ BOOL deleted;
+ CARD16 pad B16;
+} fsCatalogueChangeNotifyEvent;
+
+typedef fsCatalogueChangeNotifyEvent fsFontChangeNotifyEvent;
+
+typedef fsCatalogueChangeNotifyEvent fsEvent;
+
+/* reply codes */
+#define FS_Reply 0 /* normal reply */
+#define FS_Error 1 /* error */
+#define FS_Event 2
+
+/* request codes */
+#define FS_Noop 0
+#define FS_ListExtensions 1
+#define FS_QueryExtension 2
+#define FS_ListCatalogues 3
+#define FS_SetCatalogues 4
+#define FS_GetCatalogues 5
+#define FS_SetEventMask 6
+#define FS_GetEventMask 7
+#define FS_CreateAC 8
+#define FS_FreeAC 9
+#define FS_SetAuthorization 10
+#define FS_SetResolution 11
+#define FS_GetResolution 12
+#define FS_ListFonts 13
+#define FS_ListFontsWithXInfo 14
+#define FS_OpenBitmapFont 15
+#define FS_QueryXInfo 16
+#define FS_QueryXExtents8 17
+#define FS_QueryXExtents16 18
+#define FS_QueryXBitmaps8 19
+#define FS_QueryXBitmaps16 20
+#define FS_CloseFont 21
+
+/* restore decls */
+#undef Mask
+#undef Font
+#undef AccContext
+
+#endif /* _FS_PROTO_H_ */
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2714762
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,26 @@
+SUBDIRS=specs
+
+fontsdir = $(includedir)/X11/fonts
+fonts_HEADERS = \
+ font.h \
+ fontproto.h \
+ fontstruct.h \
+ FS.h \
+ fsmasks.h \
+ FSproto.h
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = fontsproto.pc
+
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+ $(INSTALL_CMD)
+
+ChangeLog:
+ $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
diff --git a/README b/README
new file mode 100644
index 0000000..0f8ba55
--- /dev/null
+++ b/README
@@ -0,0 +1,25 @@
+ X Fonts Extension
+
+All questions regarding this software should be directed at the
+Xorg mailing list:
+
+ http://lists.freedesktop.org/mailman/listinfo/xorg
+
+Please submit bug reports to the Xorg bugzilla:
+
+ https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
+
+The master development code repository can be found at:
+
+ git://anongit.freedesktop.org/git/xorg/proto/fontsproto
+
+ http://cgit.freedesktop.org/xorg/proto/fontsproto
+
+For patch submission instructions, see:
+
+ http://www.x.org/wiki/Development/Documentation/SubmittingPatches
+
+For more information on the git code manager, see:
+
+ http://wiki.x.org/wiki/GitPage
+
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..a2fdb82
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,17 @@
+#! /bin/sh
+
+srcdir=`dirname "$0"`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd "$srcdir"
+
+autoreconf -v --install || exit 1
+cd "$ORIGDIR" || exit $?
+
+git config --local --get format.subjectPrefix >/dev/null 2>&1 ||
+ git config --local format.subjectPrefix "PATCH fontsproto"
+
+if test -z "$NOCONFIGURE"; then
+ exec "$srcdir"/configure "$@"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..78f9ff5
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,20 @@
+AC_PREREQ([2.60])
+AC_INIT([FontsProto], [2.1.3],
+ [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+
+# Require xorg-macros minimum of 1.12 for DocBook external references
+m4_ifndef([XORG_MACROS_VERSION],
+ [m4_fatal([must install xorg-macros 1.12 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.12)
+XORG_DEFAULT_OPTIONS
+XORG_ENABLE_SPECS
+XORG_WITH_XMLTO(0.0.22)
+XORG_WITH_FOP
+XORG_WITH_XSLTPROC
+XORG_CHECK_SGML_DOCTOOLS(1.8)
+
+AC_CONFIG_FILES([Makefile
+ specs/Makefile
+ fontsproto.pc])
+AC_OUTPUT
diff --git a/docbook.am b/docbook.am
new file mode 100644
index 0000000..bba4d54
--- /dev/null
+++ b/docbook.am
@@ -0,0 +1,105 @@
+#
+# Generate output formats for a single DocBook/XML with/without chapters
+#
+# Variables set by the calling Makefile:
+# shelfdir: the location where the docs/specs are installed. Typically $(docdir)
+# docbook: the main DocBook/XML file, no chapters, appendix or image files
+# chapters: all files pulled in by an XInclude statement and images.
+#
+
+#
+# This makefile is intended for Users Documentation and Functional Specifications.
+# Do not use for Developer Documentation which is not installed and does not require olink.
+# Refer to http://www.x.org/releases/X11R7.6/doc/xorg-docs/ReleaseNotes.html#id2584393
+# for an explanation on documents classification.
+#
+
+# DocBook/XML generated output formats to be installed
+shelf_DATA =
+
+# DocBook/XML file with chapters, appendix and images it includes
+dist_shelf_DATA = $(docbook) $(chapters)
+
+if HAVE_XMLTO
+if HAVE_STYLESHEETS
+
+XMLTO_SEARCHPATH_FLAGS = \
+ --searchpath "$(XORG_SGML_PATH)/X11" \
+ --searchpath "$(abs_top_builddir)"
+XMLTO_HTML_OLINK_FLAGS = \
+ --stringparam target.database.document=$(XORG_SGML_PATH)/X11/dbs/masterdb.html.xml \
+ --stringparam current.docid="$(<:.xml=)"
+XMLTO_HTML_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-xhtml.xsl
+XMLTO_HTML_FLAGS = \
+ $(XMLTO_SEARCHPATH_FLAGS) \
+ $(XMLTO_HTML_STYLESHEET_FLAGS) \
+ $(XMLTO_HTML_OLINK_FLAGS)
+
+shelf_DATA += $(docbook:.xml=.html)
+%.html: %.xml $(chapters)
+ $(AM_V_GEN)$(XMLTO) $(XMLTO_HTML_FLAGS) xhtml-nochunks $<
+
+if HAVE_XMLTO_TEXT
+
+shelf_DATA += $(docbook:.xml=.txt)
+%.txt: %.xml $(chapters)
+ $(AM_V_GEN)$(XMLTO) $(XMLTO_HTML_FLAGS) txt $<
+endif HAVE_XMLTO_TEXT
+
+if HAVE_FOP
+XMLTO_FO_IMAGEPATH_FLAGS = --stringparam img.src.path=$(abs_builddir)/
+XMLTO_PDF_OLINK_FLAGS = \
+ --stringparam target.database.document=$(XORG_SGML_PATH)/X11/dbs/masterdb.pdf.xml \
+ --stringparam current.docid="$(<:.xml=)"
+XMLTO_FO_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-fo.xsl
+
+XMLTO_FO_FLAGS = \
+ $(XMLTO_SEARCHPATH_FLAGS) \
+ $(XMLTO_FO_STYLESHEET_FLAGS) \
+ $(XMLTO_FO_IMAGEPATH_FLAGS) \
+ $(XMLTO_PDF_OLINK_FLAGS)
+
+shelf_DATA += $(docbook:.xml=.pdf)
+%.pdf: %.xml $(chapters)
+ $(AM_V_GEN)$(XMLTO) $(XMLTO_FO_FLAGS) --with-fop pdf $<
+
+shelf_DATA += $(docbook:.xml=.ps)
+%.ps: %.xml $(chapters)
+ $(AM_V_GEN)$(XMLTO) $(XMLTO_FO_FLAGS) --with-fop ps $<
+endif HAVE_FOP
+
+# Generate documents cross-reference target databases
+if HAVE_XSLTPROC
+
+XSLT_SEARCHPATH_FLAGS = \
+ --path "$(XORG_SGML_PATH)/X11" \
+ --path "$(abs_top_builddir)"
+XSLT_OLINK_FLAGS = \
+ --stringparam targets.filename "$@" \
+ --stringparam collect.xref.targets "only" \
+ --stringparam olink.base.uri "$(@:.db=)"
+
+XSLT_HTML_FLAGS = \
+ $(XSLT_SEARCHPATH_FLAGS) \
+ $(XSLT_OLINK_FLAGS) \
+ --nonet --xinclude \
+ $(STYLESHEET_SRCDIR)/xorg-xhtml.xsl
+XSLT_PDF_FLAGS = \
+ $(XSLT_SEARCHPATH_FLAGS) \
+ $(XSLT_OLINK_FLAGS) \
+ --nonet --xinclude \
+ $(STYLESHEET_SRCDIR)/xorg-fo.xsl
+
+shelf_DATA += $(docbook:.xml=.html.db)
+%.html.db: %.xml $(chapters)
+ $(AM_V_GEN)$(XSLTPROC) $(XSLT_HTML_FLAGS) $<
+
+shelf_DATA += $(docbook:.xml=.pdf.db)
+%.pdf.db: %.xml $(chapters)
+ $(AM_V_GEN)$(XSLTPROC) $(XSLT_PDF_FLAGS) $<
+
+endif HAVE_XSLTPROC
+endif HAVE_STYLESHEETS
+endif HAVE_XMLTO
+
+CLEANFILES = $(shelf_DATA)
diff --git a/font.h b/font.h
new file mode 100644
index 0000000..b596ba2
--- /dev/null
+++ b/font.h
@@ -0,0 +1,168 @@
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef FONT_H
+#define FONT_H
+
+#include <X11/Xfuncproto.h>
+
+#ifndef BitmapFormatByteOrderMask
+#include "fsmasks.h"
+#endif
+
+/* data structures */
+#ifndef _XTYPEDEF_FONTPTR
+typedef struct _Font *FontPtr;
+#define _XTYPEDEF_FONTPTR
+#endif
+
+typedef struct _FontInfo *FontInfoPtr;
+typedef struct _FontProp *FontPropPtr;
+typedef struct _ExtentInfo *ExtentInfoPtr;
+typedef struct _FontPathElement *FontPathElementPtr;
+
+#ifndef _XTYPEDEF_CHARINFOPTR
+typedef struct _CharInfo *CharInfoPtr;
+#define _XTYPEDEF_CHARINFOPTR
+#endif
+
+typedef struct _FontNames *FontNamesPtr;
+typedef struct _FontResolution *FontResolutionPtr;
+
+#define NullCharInfo ((CharInfoPtr) 0)
+#define NullFont ((FontPtr) 0)
+#define NullFontInfo ((FontInfoPtr) 0)
+
+ /* draw direction */
+#define LeftToRight 0
+#define RightToLeft 1
+#define BottomToTop 2
+#define TopToBottom 3
+typedef int DrawDirection;
+
+#define NO_SUCH_CHAR -1
+
+
+#define FontAliasType 0x1000
+
+#define AllocError 80
+#define StillWorking 81
+#define FontNameAlias 82
+#define BadFontName 83
+#define Suspended 84
+#define Successful 85
+#define BadFontPath 86
+#define BadCharRange 87
+#define BadFontFormat 88
+#define FPEResetFailed 89 /* for when an FPE reset won't work */
+
+/* OpenFont flags */
+#define FontLoadInfo 0x0001
+#define FontLoadProps 0x0002
+#define FontLoadMetrics 0x0004
+#define FontLoadBitmaps 0x0008
+#define FontLoadAll 0x000f
+#define FontOpenSync 0x0010
+#define FontReopen 0x0020
+
+/* Query flags */
+#define LoadAll 0x1
+#define FinishRamge 0x2
+#define EightBitFont 0x4
+#define SixteenBitFont 0x8
+
+/* Glyph Caching Modes */
+#define CACHING_OFF 0
+#define CACHE_16_BIT_GLYPHS 1
+#define CACHE_ALL_GLYPHS 2
+#define DEFAULT_GLYPH_CACHING_MODE CACHE_16_BIT_GLYPHS
+extern int glyphCachingMode;
+
+struct _Client;
+
+extern int StartListFontsWithInfo(
+ struct _Client * /*client*/,
+ int /*length*/,
+ unsigned char * /*pattern*/,
+ int /*max_names*/
+);
+
+extern FontNamesPtr MakeFontNamesRecord(
+ unsigned /* size */
+);
+
+extern void FreeFontNames(
+ FontNamesPtr /* pFN*/
+);
+
+extern int AddFontNamesName(
+ FontNamesPtr /* names */,
+ char * /* name */,
+ int /* length */
+);
+
+#if 0 /* unused */
+extern int FontToFSError();
+extern FontResolutionPtr GetClientResolution();
+#endif
+
+typedef struct _FontPatternCache *FontPatternCachePtr;
+
+extern FontPatternCachePtr MakeFontPatternCache (
+ void
+);
+
+extern void FreeFontPatternCache (
+ FontPatternCachePtr /* cache */
+);
+
+extern void EmptyFontPatternCache (
+ FontPatternCachePtr /* cache */
+);
+
+extern void CacheFontPattern (
+ FontPatternCachePtr /* cache */,
+ const char * /* pattern */,
+ int /* patlen */,
+ FontPtr /* pFont */
+);
+extern _X_EXPORT FontResolutionPtr GetClientResolutions(
+ int * /* num */
+);
+
+extern FontPtr FindCachedFontPattern (
+ FontPatternCachePtr /* cache */,
+ const char * /* pattern */,
+ int /* patlen */
+);
+
+extern void RemoveCachedFontPattern (
+ FontPatternCachePtr /* cache */,
+ FontPtr /* pFont */
+);
+
+typedef enum {
+ Linear8Bit, TwoD8Bit, Linear16Bit, TwoD16Bit
+} FontEncoding;
+
+#endif /* FONT_H */
diff --git a/fontproto.h b/fontproto.h
new file mode 100644
index 0000000..ca341da
--- /dev/null
+++ b/fontproto.h
@@ -0,0 +1,94 @@
+/***********************************************************
+
+Copyright (c) 1999 The XFree86 Project Inc.
+
+All Rights Reserved.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The XFree86 Project
+Inc. shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without prior written
+authorization from The XFree86 Project Inc..
+
+*/
+#ifndef _FONTPROTO_H
+#define _FONTPROTO_H
+
+#include <X11/Xfuncproto.h>
+
+/* Externally provided functions required by libXfont */
+
+extern _X_EXPORT int RegisterFPEFunctions (
+ NameCheckFunc name_func,
+ InitFpeFunc init_func,
+ FreeFpeFunc free_func,
+ ResetFpeFunc reset_func,
+ OpenFontFunc open_func,
+ CloseFontFunc close_func,
+ ListFontsFunc list_func,
+ StartLfwiFunc start_lfwi_func,
+ NextLfwiFunc next_lfwi_func,
+ WakeupFpeFunc wakeup_func,
+ ClientDiedFunc client_died,
+ LoadGlyphsFunc load_glyphs,
+ StartLaFunc start_list_alias_func,
+ NextLaFunc next_list_alias_func,
+ SetPathFunc set_path_func);
+
+extern _X_EXPORT int GetDefaultPointSize ( void );
+
+extern _X_EXPORT int init_fs_handlers ( FontPathElementPtr fpe,
+ BlockHandlerProcPtr block_handler);
+extern _X_EXPORT void remove_fs_handlers ( FontPathElementPtr fpe,
+ BlockHandlerProcPtr block_handler,
+ Bool all );
+
+extern _X_EXPORT int client_auth_generation ( ClientPtr client );
+
+#ifndef ___CLIENTSIGNAL_DEFINED___
+#define ___CLIENTSIGNAL_DEFINED___
+extern Bool ClientSignal ( ClientPtr client );
+#endif /* ___CLIENTSIGNAL_DEFINED___ */
+
+extern _X_EXPORT void DeleteFontClientID ( Font id );
+extern _X_EXPORT Font GetNewFontClientID ( void );
+extern _X_EXPORT int StoreFontClientFont ( FontPtr pfont, Font id );
+extern _X_EXPORT void FontFileRegisterFpeFunctions ( void );
+extern _X_EXPORT void FontFileCheckRegisterFpeFunctions ( void );
+
+extern Bool XpClientIsBitmapClient ( ClientPtr client );
+extern Bool XpClientIsPrintClient( ClientPtr client, FontPathElementPtr fpe );
+extern void PrinterFontRegisterFpeFunctions ( void );
+
+extern void fs_register_fpe_functions ( void );
+extern void check_fs_register_fpe_functions ( void );
+
+/* util/private.c */
+extern FontPtr CreateFontRec (void);
+extern void DestroyFontRec (FontPtr font);
+extern Bool _FontSetNewPrivate (FontPtr /* pFont */,
+ int /* n */,
+ void * /* ptr */);
+extern int AllocateFontPrivateIndex (void);
+extern void ResetFontPrivateIndex (void);
+
+/* Type1/t1funcs.c */
+extern void Type1RegisterFontFileFunctions(void);
+extern void CIDRegisterFontFileFunctions(void);
+
+/* Speedo/spfuncs.c */
+extern void SpeedoRegisterFontFileFunctions(void);
+
+/* FreeType/ftfuncs.c */
+extern void FreeTypeRegisterFontFileFunctions(void);
+
+#endif
diff --git a/fontsproto.pc.in b/fontsproto.pc.in
new file mode 100644
index 0000000..b7db169
--- /dev/null
+++ b/fontsproto.pc.in
@@ -0,0 +1,9 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: FontsProto
+Description: Fonts extension headers
+Version: @PACKAGE_VERSION@
+Cflags: -I${includedir}
diff --git a/fontstruct.h b/fontstruct.h
new file mode 100644
index 0000000..55c89da
--- /dev/null
+++ b/fontstruct.h
@@ -0,0 +1,297 @@
+/***********************************************************
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+#ifndef FONTSTR_H
+#define FONTSTR_H
+
+#include <X11/Xproto.h>
+#include "font.h"
+#include <X11/Xfuncproto.h>
+#include <X11/Xdefs.h>
+
+/*
+ * This version of the server font data strucutre is only for describing
+ * the in memory data structure. The file structure is not necessarily a
+ * copy of this. That is up to the compiler and the OS layer font loading
+ * machinery.
+ */
+
+#define GLYPHPADOPTIONS 4 /* 1, 2, 4, or 8 */
+
+typedef struct _FontProp {
+ long name;
+ long value; /* assumes ATOM is not larger than INT32 */
+} FontPropRec;
+
+typedef struct _FontResolution {
+ unsigned short x_resolution;
+ unsigned short y_resolution;
+ unsigned short point_size;
+} FontResolutionRec;
+
+typedef struct _ExtentInfo {
+ DrawDirection drawDirection;
+ int fontAscent;
+ int fontDescent;
+ int overallAscent;
+ int overallDescent;
+ int overallWidth;
+ int overallLeft;
+ int overallRight;
+} ExtentInfoRec;
+
+typedef struct _CharInfo {
+ xCharInfo metrics; /* info preformatted for Queries */
+ char *bits; /* pointer to glyph image */
+} CharInfoRec;
+
+/*
+ * Font is created at font load time. It is specific to a single encoding.
+ * e.g. not all of the glyphs in a font may be part of a single encoding.
+ */
+
+typedef struct _FontInfo {
+ unsigned short firstCol;
+ unsigned short lastCol;
+ unsigned short firstRow;
+ unsigned short lastRow;
+ unsigned short defaultCh;
+ unsigned int noOverlap:1;
+ unsigned int terminalFont:1;
+ unsigned int constantMetrics:1;
+ unsigned int constantWidth:1;
+ unsigned int inkInside:1;
+ unsigned int inkMetrics:1;
+ unsigned int allExist:1;
+ unsigned int drawDirection:2;
+ unsigned int cachable:1;
+ unsigned int anamorphic:1;
+ short maxOverlap;
+ short pad;
+ xCharInfo maxbounds;
+ xCharInfo minbounds;
+ xCharInfo ink_maxbounds;
+ xCharInfo ink_minbounds;
+ short fontAscent;
+ short fontDescent;
+ int nprops;
+ FontPropPtr props;
+ char *isStringProp;
+} FontInfoRec;
+
+typedef struct _Font {
+ int refcnt;
+ FontInfoRec info;
+ char bit;
+ char byte;
+ char glyph;
+ char scan;
+ fsBitmapFormat format;
+ int (*get_glyphs) (FontPtr /* font */,
+ unsigned long /* count */,
+ unsigned char * /* chars */,
+ FontEncoding /* encoding */,
+ unsigned long * /* count */,
+ CharInfoPtr * /* glyphs */);
+ int (*get_metrics) (FontPtr /* font */,
+ unsigned long /* count */,
+ unsigned char * /* chars */,
+ FontEncoding /* encoding */,
+ unsigned long * /* count */,
+ xCharInfo ** /* glyphs */);
+ void (*unload_font) (FontPtr /* font */);
+ void (*unload_glyphs) (FontPtr /* font */);
+ FontPathElementPtr fpe;
+ void *svrPrivate;
+ void *fontPrivate;
+ void *fpePrivate;
+ int maxPrivate;
+ void **devPrivates;
+} FontRec;
+
+#define FontGetPrivate(pFont,n) ((n) > (pFont)->maxPrivate ? (void *) 0 : \
+ (pFont)->devPrivates[n])
+
+#define FontSetPrivate(pFont,n,ptr) ((n) > (pFont)->maxPrivate ? \
+ _FontSetNewPrivate (pFont, n, ptr) : \
+ ((((pFont)->devPrivates[n] = (ptr)) != 0) || TRUE))
+
+typedef struct _FontNames {
+ int nnames;
+ int size;
+ int *length;
+ char **names;
+} FontNamesRec;
+
+
+/* External view of font paths */
+typedef struct _FontPathElement {
+ int name_length;
+#if FONT_PATH_ELEMENT_NAME_CONST
+ const
+#endif
+ char *name;
+ int type;
+ int refcount;
+ void *private;
+} FontPathElementRec;
+
+typedef Bool (*NameCheckFunc) (const char *name);
+typedef int (*InitFpeFunc) (FontPathElementPtr fpe);
+typedef int (*FreeFpeFunc) (FontPathElementPtr fpe);
+typedef int (*ResetFpeFunc) (FontPathElementPtr fpe);
+typedef int (*OpenFontFunc) ( void *client,
+ FontPathElementPtr fpe,
+ Mask flags,
+ const char* name,
+ int namelen,
+ fsBitmapFormat format,
+ fsBitmapFormatMask fmask,
+ XID id,
+ FontPtr* pFont,
+ char** aliasName,
+ FontPtr non_cachable_font);
+typedef void (*CloseFontFunc) (FontPathElementPtr fpe, FontPtr pFont);
+typedef int (*ListFontsFunc) (void *client,
+ FontPathElementPtr fpe,
+ const char* pat,
+ int len,
+ int max,
+ FontNamesPtr names);
+
+typedef int (*StartLfwiFunc) (void *client,
+ FontPathElementPtr fpe,
+ const char* pat,
+ int len,
+ int max,
+ void ** privatep);
+
+typedef int (*NextLfwiFunc) (void *client,
+ FontPathElementPtr fpe,
+ char** name,
+ int* namelen,
+ FontInfoPtr* info,
+ int* numFonts,
+ void *private);
+
+typedef int (*WakeupFpeFunc) (FontPathElementPtr fpe,
+ unsigned long* LastSelectMask);
+
+typedef void (*ClientDiedFunc) (void *client,
+ FontPathElementPtr fpe);
+
+typedef int (*LoadGlyphsFunc) (void *client,
+ FontPtr pfont,
+ Bool range_flag,
+ unsigned int nchars,
+ int item_size,
+ unsigned char* data);
+
+typedef int (*StartLaFunc) (void *client,
+ FontPathElementPtr fpe,
+ const char* pat,
+ int len,
+ int max,
+ void ** privatep);
+
+typedef int (*NextLaFunc) (void *client,
+ FontPathElementPtr fpe,
+ char** namep,
+ int* namelenp,
+ char** resolvedp,
+ int* resolvedlenp,
+ void *private);
+
+typedef void (*SetPathFunc)(void);
+
+typedef struct _FPEFunctions {
+ NameCheckFunc name_check;
+ InitFpeFunc init_fpe;
+ ResetFpeFunc reset_fpe;
+ FreeFpeFunc free_fpe;
+ OpenFontFunc open_font;
+ CloseFontFunc close_font;
+ ListFontsFunc list_fonts;
+ StartLaFunc start_list_fonts_and_aliases;
+ NextLaFunc list_next_font_or_alias;
+ StartLfwiFunc start_list_fonts_with_info;
+ NextLfwiFunc list_next_font_with_info;
+ WakeupFpeFunc wakeup_fpe;
+ ClientDiedFunc client_died;
+ /* for load_glyphs, range_flag = 0 ->
+ nchars = # of characters in data
+ item_size = bytes/char
+ data = list of characters
+ range_flag = 1 ->
+ nchars = # of fsChar2b's in data
+ item_size is ignored
+ data = list of fsChar2b's */
+ LoadGlyphsFunc load_glyphs;
+ SetPathFunc set_path_hook;
+} FPEFunctionsRec, FPEFunctions;
+
+/*
+ * Various macros for computing values based on contents of
+ * the above structures
+ */
+
+#define GLYPHWIDTHPIXELS(pci) \
+ ((pci)->metrics.rightSideBearing - (pci)->metrics.leftSideBearing)
+
+#define GLYPHHEIGHTPIXELS(pci) \
+ ((pci)->metrics.ascent + (pci)->metrics.descent)
+
+#define GLYPHWIDTHBYTES(pci) (((GLYPHWIDTHPIXELS(pci))+7) >> 3)
+
+#define GLYPHWIDTHPADDED(bc) (((bc)+7) & ~0x7)
+
+#define BYTES_PER_ROW(bits, nbytes) \
+ ((nbytes) == 1 ? (((bits)+7)>>3) /* pad to 1 byte */ \
+ :(nbytes) == 2 ? ((((bits)+15)>>3)&~1) /* pad to 2 bytes */ \
+ :(nbytes) == 4 ? ((((bits)+31)>>3)&~3) /* pad to 4 bytes */ \
+ :(nbytes) == 8 ? ((((bits)+63)>>3)&~7) /* pad to 8 bytes */ \
+ : 0)
+
+#define BYTES_FOR_GLYPH(ci,pad) (GLYPHHEIGHTPIXELS(ci) * \
+ BYTES_PER_ROW(GLYPHWIDTHPIXELS(ci),pad))
+/*
+ * Macros for computing different bounding boxes for fonts; from
+ * the font protocol
+ */
+
+#define FONT_MAX_ASCENT(pi) ((pi)->fontAscent > (pi)->ink_maxbounds.ascent ? \
+ (pi)->fontAscent : (pi)->ink_maxbounds.ascent)
+#define FONT_MAX_DESCENT(pi) ((pi)->fontDescent > (pi)->ink_maxbounds.descent ? \
+ (pi)->fontDescent : (pi)->ink_maxbounds.descent)
+#define FONT_MAX_HEIGHT(pi) (FONT_MAX_ASCENT(pi) + FONT_MAX_DESCENT(pi))
+#define FONT_MIN_LEFT(pi) ((pi)->ink_minbounds.leftSideBearing < 0 ? \
+ (pi)->ink_minbounds.leftSideBearing : 0)
+#define FONT_MAX_RIGHT(pi) ((pi)->ink_maxbounds.rightSideBearing > \
+ (pi)->ink_maxbounds.characterWidth ? \
+ (pi)->ink_maxbounds.rightSideBearing : \
+ (pi)->ink_maxbounds.characterWidth)
+#define FONT_MAX_WIDTH(pi) (FONT_MAX_RIGHT(pi) - FONT_MIN_LEFT(pi))
+
+#include "fontproto.h"
+
+#endif /* FONTSTR_H */
diff --git a/fsmasks.h b/fsmasks.h
new file mode 100644
index 0000000..c86be83
--- /dev/null
+++ b/fsmasks.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices or Digital
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.
+ * Network Computing Devices and Digital make no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES
+ * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+
+/*
+
+Portions Copyright 1987, 1994, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+
+
+/*
+ * masks & values used by the font lib and the font server
+ */
+
+#ifndef _FSMASKS_H_
+#define _FSMASKS_H_
+
+#include <X11/Xmd.h>
+
+/* font format macros */
+#define BitmapFormatByteOrderMask (1L << 0)
+#define BitmapFormatBitOrderMask (1L << 1)
+#define BitmapFormatImageRectMask (3L << 2)
+#define BitmapFormatScanlinePadMask (3L << 8)
+#define BitmapFormatScanlineUnitMask (3L << 12)
+
+#define BitmapFormatByteOrderLSB (0)
+#define BitmapFormatByteOrderMSB (1L << 0)
+#define BitmapFormatBitOrderLSB (0)
+#define BitmapFormatBitOrderMSB (1L << 1)
+
+#define BitmapFormatImageRectMin (0L << 2)
+#define BitmapFormatImageRectMaxWidth (1L << 2)
+#define BitmapFormatImageRectMax (2L << 2)
+
+#define BitmapFormatScanlinePad8 (0L << 8)
+#define BitmapFormatScanlinePad16 (1L << 8)
+#define BitmapFormatScanlinePad32 (2L << 8)
+#define BitmapFormatScanlinePad64 (3L << 8)
+
+#define BitmapFormatScanlineUnit8 (0L << 12)
+#define BitmapFormatScanlineUnit16 (1L << 12)
+#define BitmapFormatScanlineUnit32 (2L << 12)
+#define BitmapFormatScanlineUnit64 (3L << 12)
+
+#define BitmapFormatMaskByte (1L << 0)
+#define BitmapFormatMaskBit (1L << 1)
+#define BitmapFormatMaskImageRectangle (1L << 2)
+#define BitmapFormatMaskScanLinePad (1L << 3)
+#define BitmapFormatMaskScanLineUnit (1L << 4)
+
+typedef CARD32 fsBitmapFormat;
+typedef CARD32 fsBitmapFormatMask;
+
+#endif /* _FSMASKS_H_ */
diff --git a/specs/.gitignore b/specs/.gitignore
new file mode 100644
index 0000000..92946c9
--- /dev/null
+++ b/specs/.gitignore
@@ -0,0 +1,5 @@
+*.html
+*.ps
+*.pdf
+*.txt
+*.db
diff --git a/specs/Makefile.am b/specs/Makefile.am
new file mode 100644
index 0000000..4035d4b
--- /dev/null
+++ b/specs/Makefile.am
@@ -0,0 +1,13 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = fsproto.xml
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/fsproto.xml b/specs/fsproto.xml
new file mode 100644
index 0000000..74f2428
--- /dev/null
+++ b/specs/fsproto.xml
@@ -0,0 +1,4417 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
+[
+<!ENTITY % defs SYSTEM "defs.ent"> %defs;
+]>
+
+
+<book id="fsproto">
+
+<bookinfo>
+ <title>The X Font Service Protocol</title>
+ <subtitle>X Consortium Standard</subtitle>
+ <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+ <releaseinfo>Version 2.0</releaseinfo>
+ <authorgroup>
+ <author>
+ <firstname>Jim</firstname><surname>Fulton</surname>
+ <affiliation><orgname>Network Computing Devices, Inc.</orgname></affiliation>
+ </author>
+ </authorgroup>
+ <edition>Revised May 2, 1994</edition>
+ <copyright><year>1991</year><holder>Network Computing Devices, Inc.</holder></copyright>
+
+<legalnotice>
+<para>
+Permission to use, copy, modify, distribute, and sell this
+documentation for any purpose is hereby granted without fee,
+provided that the above copyright notice and this permission
+notice appear in all copies. Network Computing Devices, Inc.
+makes no representations about the suitability for any purpose
+of the information in this document. This documentation is
+provided &ldquo;as is&rdquo; without express or implied warranty.
+</para>
+</legalnotice>
+
+<legalnotice>
+<para role="multiLicensing">Copyright © 1994 X Consortium</para>
+<para>
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the &ldquo;Software&rdquo;), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+</para>
+<para>
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+</para>
+<para>
+THE SOFTWARE IS PROVIDED &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+</para>
+<para>
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+</para>
+</legalnotice>
+</bookinfo>
+
+<chapter id='Introduction'>
+<title>Introduction</title>
+<para>
+The management of fonts in large, heterogeneous environments is one of the
+hardest aspects of using the X Window System
+<footnote id='footnote1'><para>
+<firstterm><trademark>X Window System</trademark></firstterm>
+is a trademark of The Open Group.
+</para></footnote>
+. Multiple formats and the lack of
+a consistent mechanism for exporting font data to all displays on a network
+prevent the transparent use of applications across different display platforms.
+The X Font Service protocol is designed to address this and other issues, with
+specific emphasis on the needs of the core X protocol. Upward-compatible
+changes (typically in the form of new requests) are expected as consensus is
+reached on new features (particularly outline font support).
+</para>
+<para>
+Currently, most X displays use network file protocols such as
+<acronym>NFS</acronym> and <acronym>TFTP</acronym> to
+obtain raw font data which they parse directly. Since a common binary format
+for this data doesn't exist, displays must be able to interpret a variety of
+formats if they are to be used with different application hosts. This leads to
+wasted code and data space and a loss of interoperability as displays are used
+in unforeseen environments.
+</para>
+<para>
+By moving the interpretation of font data out of the X server into a separate
+service on the network, these problems can be greatly reduced. In addition,
+new technologies, such as dynamically generating bitmaps from scaled or outline
+fonts, can be provided to all displays transparently. For horizontal text,
+caching techniques and increased processor power can potentially make
+rasterization more efficient on large, centralized hosts than on individual
+displays.
+</para>
+<para>
+Each font server provides sets of fonts that may be listed and queried for
+header, property, glyph extents, and bitmap information. This data is
+transmitted over the network using a binary format (with variations to support
+different bit- and byte-orders) designed to minimize the amount of processing
+required by the display. Since the font server, rather than the display, is
+responsible for parsing the raw font data, new formats can be used by all
+displays by modifying a single font server.
+</para>
+<para>
+From the user's point of view, font servers are simply a new type of name in
+the X font path. Network name services allow descriptive names (such as
+DEPARTMENT-FONTS or APPLICATION-FONTS) to be translated into proper network
+addresses. X displays send requests to and read replies from the font server
+rather than reading directly from files. Since the X Font Service protocol is
+designed to allow subsets of the font data to be requested, displays may easily
+implement a variety of strategies for fine-grained demand-loading of glyphs.
+</para>
+</chapter>
+
+<chapter id='Architectural_Model'>
+<title>Architectural Model</title>
+<!-- .XS -->
+<!-- (SN Architectural Model -->
+<!-- .XE -->
+<para>
+In this document, the words <firstterm>client</firstterm> and
+<firstterm>server</firstterm> refer to the consumer and
+provider of a font, respectively, unless otherwise indicated. It is important
+to note that in this context, the X server is also a font client.
+</para>
+<para>
+The X Font Service protocol does not require any changes to the core X protocol
+or to any applications. To the user, font servers are simply additional types
+of font path elements. As such, X servers may connect to multiple font
+servers, as shown in Figure 2.1. Although the font protocol is geared towards
+the X Window System, it may be also used by other consumers of font data (such
+as printer drivers).
+</para>
+
+<figure id="figure2.1" label="2.1"><title>Connecting to a Font Server</title>
+<literallayout class="monospaced">
+ ┌────────┐ ┌───────────────┐
+ │ X1 ├──────────────┤ │
+ │ Server │ │ Font Server │
+ └────────┘ ┌───────┤ 1 │
+ │ └───────────────┘
+ ┌────────┐ │
+ │ X2 ├──────┘ ┌───────────────┐
+ │ Server ├──────────────┤ │
+ └────────┘ │ Font Server │
+ ┌───────┤ 2 │
+┌─────────┐ │ └───────────────┘
+│ other │ │
+│ clients ├──────┘
+└─────────┘
+</literallayout>
+</figure>
+
+<para>
+Clients communicate with the font server using the request/reply/event model
+over any mutually-understood virtual stream connection (such as
+<acronym>TCP/IP</acronym>, DECnet,
+<footnote id='footnote2'><para>
+<firstterm><trademark>DECnet</trademark></firstterm> is a trademark
+of Digital Equipment Corporation.
+</para></footnote>
+etc.). Font servers are responsible for providing data in the bit and byte
+orders requested by the client. The set of requests and events provided in the
+first version of the X Font Service protocol is limited to supporting the needs
+of the bitmap-oriented core X Window System protocol. Extensions are expected
+as new needs evolve.
+</para>
+<para>
+A font server reads raw font data from a variety of sources (possibly
+including other font servers) and converts it into a common format that is
+transmitted to the client using the protocol described in
+<link linkend='Protocol'>Section 4</link>. New font
+formats are handled by adding new converters to a font server, as shown in
+Figure 2.2.
+</para>
+
+<figure id="figure2.2" label="2.2"><title>Where Font Data Comes From</title>
+<literallayout class="monospaced">
+ ┌────────────┐
+ │ client │
+ │ (X server) │
+ └─────┬──────┘
+ │
+ network
+ │
+┌─────────────────────┴──────────────────────┐
+│ │
+│ font server 1 │
+│ │
+├─────┬─────┬─────┬─────┬────┬─────┬───┬─────┤
+│ bdf │ snf │ pcf │ atm │ f3 │ dwf │ │ │ ... │
+└─────┴─────┴─────┴─────┴────┴─────┴─│─┴─────┘
+ │
+ network
+ │
+ ┌─────┴────┐
+ │ font │
+ │ server 2 │
+ └──────────┘
+</literallayout>
+</figure>
+
+<para>
+The server may choose to provide named sets of fonts called
+<firstterm>catalogues</firstterm>.
+Clients may specify which of the sets should be used in listing or opening a
+font.
+</para>
+
+<para>
+An event mechanism similar to that used in the X protocol is provided for
+asynchronous notification of clients by the server.
+</para>
+
+<para>
+Clients may provide authorization data for the server to be used in determining
+(according to the server's licensing policy) whether or not access should be
+granted to particular fonts. This is particularly useful for clients whose
+authorization changes over time (such as an X server that can verify the
+identity of the user).
+</para>
+<para>
+Implementations that wish to provide additional requests or events may use the
+extension mechanism. Adding to the core font service protocol (with the
+accompanying change in the major or minor version numbers) is reserved to the X
+Consortium.
+</para>
+</chapter>
+
+<chapter id='Font_Server_Naming'>
+<title>Font Server Naming</title>
+<!-- .XS -->
+<!-- (SN Font Server Naming -->
+<!-- .XE -->
+<para>
+Font clients that expose font server names to the user are encouraged to
+provide ways of naming font servers symbolically (e.g. DEPARTMENT-FONTS).
+However, for environments that lack appropriate name services
+transport-specific names are necessary. Since these names do occur in the
+protocol, clients and servers should support at least the applicable formats
+described below. Formats for additional transports may be registered with the
+X Consortium.
+</para>
+
+<section id='TCPIP_Names'>
+<title>TCP/IP Names</title>
+<!-- .XS -->
+<!-- (SN TCP/IP Names -->
+<!-- .XE -->
+<para>
+The following syntax should be used for TCP/IP names:
+
+<literallayout class="monospaced">
+ <replaceable>TCP name</replaceable> ::= <literal>tcp/</literal> <replaceable>hostname</replaceable> <literal>:</literal> <replaceable>ipportnumber</replaceable> <optional><literal>/</literal> <replaceable>cataloguelist</replaceable></optional>
+</literallayout>
+
+where <replaceable>hostname</replaceable> is either symbolic (such as
+<systemitem class="systemname">expo.lcs.mit.edu</systemitem>) or numeric
+decimal (such as <systemitem class="ipaddress">18.30.0.212</systemitem>).
+The <replaceable>ipportnumber</replaceable> is the port on which the
+font server is listening for connections.
+The <replaceable>cataloguelist</replaceable> string at
+the end is optional and specifies a plus-separated list of catalogues
+that may be requested. For example:
+<literallayout class="monospaced">
+ tcp/expo.lcs.mit.edu:8012/available+special
+ tcp/18.30.0.212:7890
+</literallayout>
+</para>
+</section>
+
+<section id='DECnet_Names'>
+<title>DECnet Names</title>
+<!-- .XS -->
+<!-- (SN DECnet Names -->
+<!-- .XE -->
+<para>
+The following syntax should be used for DECnet names:
+
+<literallayout class="monospaced">
+ <replaceable>DECnet name</replaceable> ::= <literal>decnet/</literal> <replaceable>nodename</replaceable> <literal>::font$</literal> <replaceable>objname</replaceable> <optional><literal>/</literal> <replaceable>cataloguelist</replaceable></optional>
+</literallayout>
+
+where <replaceable>nodename</replaceable> is either symbolic (such as
+<systemitem class="systemname">SRVNOD</systemitem>) or the
+numeric decimal form of the DECnet address (such as
+<systemitem class="ipaddress">44.70</systemitem>).
+The <replaceable>objname</replaceable> is normal, case-insensitive DECnet
+object name. The <replaceable>cataloguelist</replaceable> string
+at the end is
+optional and specifies a plus-separated list of catalogues that may be
+requested. For example:
+
+<literallayout class="monospaced">
+ DECNET/SRVNOD::FONT$DEFAULT/AVAILABLE
+ decnet/44.70::font$other
+</literallayout>
+</para>
+</section>
+</chapter>
+
+<chapter id='Protocol'>
+<title>Protocol</title>
+<!-- .XS -->
+<!-- (SN Protocol -->
+<!-- .XE -->
+<para>
+The protocol described below uses the request/reply/error model and is
+specified using the same conventions outlined in
+<olink targetdoc='x11protocol' targetptr='Syntactic_Conventions'>Section 2
+of the core X Window System protocol</olink>
+<xref linkend="References:x11proto"/>:
+</para>
+<itemizedlist>
+ <listitem>
+ <para>
+<!-- .IP \(bu 5 -->
+Data type names are spelled in upper case with no word separators,
+as in: <link linkend="Data_Types:FONTID"><type>FONTID</type></link>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+<!-- .IP \(bu 5 -->
+Alternate values are capitalized with no word separators,
+as in: <constant>MaxWidth</constant>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+<!-- .IP \(bu 5 -->
+Structure element declarations are in lower case with hyphens
+as word separators, as in: <structfield>byte-order-msb</structfield>
+ </para>
+ <note>
+ <para>
+Structure element names are referred to in
+upper case (e.g. <structfield>BYTE-ORDER-MSB</structfield>) when used in
+descriptions to set them off from the surrounding
+text. When this document is typeset they will be
+printed in lower case in a distinct font.
+ </para>
+ </note>
+ </listitem>
+ <listitem>
+ <para>
+Type declarations have the form <quote><type>name</type>: type</quote>,
+as in: <type>CARD8</type>: 8-bit byte
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Comma-separated lists of alternate values are enclosed in
+braces, as in: { <constant>Min</constant>, <constant>MaxWidth</constant>,
+<constant>Max</constant> }
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Comma-separated lists of structure elements are enclosed in
+brackets, as in: [ <structfield>byte1</structfield>: <type>CARD8</type>,
+<structfield>byte2</structfield>: <type>CARD8</type> ]
+ </para>
+ </listitem>
+</itemizedlist>
+
+<para>
+A type with a prefix <quote>LISTof</quote> represents a counted list of
+elements of that type, as in: <type>LISTofCARD8</type>
+</para>
+
+<section id='Data_Types'>
+<title>Data Types</title>
+<!-- .XS -->
+<!-- (SN Data Types -->
+<!-- .XE -->
+<para>
+The following data types are used in the core X Font Server protocol:
+</para>
+
+<section id="Data_Types:ACCESSCONTEXT">
+ <title><type>ACCESSCONTEXT</type></title>
+ <indexterm zone="Data_Types:ACCESSCONTEXT" significance="preferred"><primary>ACCESSCONTEXT</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>ACCESSCONTEXT</type>:</entry><entry><link linkend="Data_Types:ID"><type>ID</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+This value is specified in the CreateAC request as the identifier
+to be used when referring to a particular AccessContext resource
+within the server. These resources are used by the server to
+store client-specified authorization information. This
+information may be used by the server to determine whether or not
+the client should be granted access to particular font data.
+</para>
+<para>
+In order to preserve the integrity of font licensing being performed by
+the font server, care must be taken by a client to properly represent the
+identity of the true user of the font. Some font clients will in fact
+be servers (for example, X servers) requesting fonts for their own clients.
+Other font clients may be doing work on behalf of a number of different
+users over time (for example, print spoolers).
+</para>
+<para>
+<type>AccessContext</type>s
+must be created (with
+<link linkend="Requests:CreateAC"><function>CreateAC</function></link>)
+and switched among (with
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>)
+to represent all of these <quote>font users</quote> properly.
+ </para>
+</section>
+
+<section id="Data_Types:ALTERNATESERVER">
+ <title><type>ALTERNATESERVER</type></title>
+ <indexterm zone="Data_Types:ALTERNATESERVER" significance="preferred"><primary>ALTERNATESERVER</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows="1"><type>ALTERNATESERVER</type>:</entry>
+ <entry> [ <structfield>name</structfield>:</entry><entry> <link linkend="Data_Types:STRING8"><type>STRING8</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>subset</structfield>:</entry><entry> <link linkend="Data_Types:BOOL"><type>BOOL</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure specifies the <structfield>NAME</structfield>,
+encoded in <acronym>ISO</acronym> 8859-1 according
+to <link linkend='Font_Server_Naming'>Section 3</link>,
+of another font server that may be useful as a
+substitute for this font server.
+The <structfield>SUBSET</structfield> field indicates
+whether or not the alternate server is likely to only contain a
+subset of the fonts available from this font server. This
+information is returned during the initial connection setup and
+may be used by the client to find a backup server in case of
+failure.
+ </para>
+</section>
+
+<section id="Data_Types:AUTH">
+ <title><type>AUTH</type></title>
+ <indexterm zone="Data_Types:AUTH" significance="preferred"><primary>AUTH</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows="1"><type>AUTH</type>:</entry><entry>[ <structfield>name</structfield>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>data</structfield>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This structure specifies the name of an authorization protocol and
+initial data for that protocol. It is used in the authorization
+negotiation in the initial connection setup and in the CreateAC
+request.
+</para>
+</section>
+
+<section id="Data_Types:BITMAPFORMAT">
+ <title><type>BITMAPFORMAT</type></title>
+ <indexterm zone="Data_Types:BITMAPFORMAT" significance="preferred"><primary>BITMAPFORMAT</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>BITMAPFORMAT</type>:</entry><entry><type>CARD32</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+ <type>CARD32</type> containing the following fields defined by the
+ sets of values given further below
+ </para>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>[</entry></row>
+ <row><entry>&emsp;<structfield>byte-order-msb</structfield>:</entry><entry> 1 bit,</entry></row>
+ <row><entry>&emsp;<structfield>bit-order-msb</structfield>:</entry><entry> 1 bit,</entry></row>
+ <row><entry>&emsp;<structfield>image-rect</structfield>:</entry><entry> 2 bits</entry><entry>{ <constant>Min</constant>,
+ <constant>MaxWidth</constant>,
+ <constant>Max</constant> },</entry></row>
+ <row><entry>&emsp;<structfield>zero-pad</structfield>:</entry><entry> 4 bits,</entry></row>
+ <row><entry>&emsp;<structfield>scanline-pad</structfield>:</entry><entry> 2 bits</entry><entry>{ <constant>ScanlinePad8</constant>,
+ <constant>ScanlinePad16</constant>,
+ <constant>ScanlinePad32</constant>,
+ <constant>ScanlinePad64</constant> },</entry></row>
+ <row><entry>&emsp;<structfield>zero-pad</structfield>:</entry><entry> 2 bits,</entry></row>
+ <row><entry>&emsp;<structfield>scanline-unit</structfield>:</entry><entry> 2 bits</entry><entry>{ <constant>ScanlineUnit8</constant>,
+ <constant>ScanlineUnit16</constant>,
+ <constant>ScanlineUnit32</constant>,
+ <constant>ScanlineUnit64</constant> },</entry></row>
+ <row><entry>&emsp;<structfield>zero-pad</structfield>:</entry><entry> 2 bits,</entry></row>
+ <row><entry>&emsp;<structfield>zero-pad</structfield>:</entry><entry> 16 bits,</entry></row>
+ <row><entry>]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This structure specifies how glyph images are transmitted in
+response to
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>
+and
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+requests.
+</para>
+<para>
+If the <structfield>BYTE-ORDER-MSB</structfield> bit
+<literal>(1 &lt;&lt; 0)</literal> is set, the Most Significant
+Byte of each scanline unit is returned first. Otherwise, the
+Least Significant Byte is returned first.
+</para>
+<para>
+If the <structfield>BIT-ORDER-MSB</structfield> bit
+<literal>(1 &lt;&lt; 1)</literal> is set, the left-most bit in
+each glyph scanline unit is stored in the Most Significant Bit of
+each transmitted scanline unit. Otherwise, the left-most bit is
+stored in the Least Significant Bit.
+</para>
+<para>
+The <structfield>IMAGE-RECT</structfield> field specifies a rectangle of
+pixels within the
+glyph image. It contains one of the following alternate values:
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>ImageRectMin</constant></entry><entry><literal>(0 &lt;&lt; 2)</literal></entry></row>
+ <row><entry><constant>ImageRectMaxWidth</constant></entry><entry><literal>(1 &lt;&lt; 2)</literal></entry></row>
+ <row><entry><constant>ImageRectMax</constant></entry><entry><literal>(2 &lt;&lt; 2)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+For a glyph with extents <link linkend="Data_Types:XCHARINFO"><type>XCHARINFO</type></link> in a font with header
+information <link linkend="Data_Types:XFONTINFO"><type>XFONTINFO</type></link>, the <structfield>IMAGE-RECT</structfield>
+values have the following meanings:
+<variablelist>
+ <varlistentry id="Constant:ImageRectMin">
+ <term><constant>ImageRectMin</constant></term>
+ <listitem>
+ <indexterm zone="Constant:ImageRectMin" significance="preferred"><primary>ImageRectMin</primary></indexterm>
+ <para>
+This refers to the minimal bounding rectangle
+surrounding the inked pixels in the glyph. This is the
+most compact representation. The edges of the rectangle
+are:
+<literallayout class="monospaced">
+ left: <structfield>XCHARINFO.LBEARING</structfield>
+ right: <structfield>XCHARINFO.RBEARING</structfield>
+ top: <structfield>XCHARINFO.ASCENT</structfield>
+ bottom: <structfield>XCHARINFO.DESCENT</structfield>
+</literallayout>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:ImageRectMaxWidth">
+ <term><constant>ImageRectMaxWidth</constant></term>
+ <listitem>
+ <indexterm zone="Constant:ImageRectMaxWidth" significance="preferred"><primary>ImageRectMaxWidth</primary></indexterm>
+ <para>
+This refers to the scanlines between the
+glyph's ascent and descent, padded on the left to the minimum
+left-bearing (or 0, whichever is less) and on the right to
+the maximum right-bearing (or logical-width, whichever is
+greater). All glyph images share a common horizontal
+origin. This is a combination of <constant>ImageRectMax</constant> in the
+horizontal direction and <constant>ImageRectMin</constant> in the vertical
+direction. The edges of the rectangle are:
+
+<literallayout class="monospaced">
+left: min (<structfield>XFONTINFO.MIN-BOUNDS.LBEARING</structfield>, 0)
+right: max (<structfield>XFONTINFO.MAX-BOUNDS.RBEARING</structfield>,
+ <structfield>XFONTINFO.MAX-BOUNDS.WIDTH</structfield>)
+top: <structfield>XCHARINFO.ASCENT</structfield>
+bottom: <structfield>XCHARINFO.DESCENT</structfield>
+</literallayout>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:ImageRectMax">
+ <term><constant>ImageRectMax</constant></term>
+ <listitem>
+ <indexterm zone="Constant:ImageRectMax" significance="preferred"><primary>ImageRectMax</primary></indexterm>
+ <para>
+This refers to all scanlines, from the maximum
+ascent (or the font ascent, whichever is greater) to the
+maximum descent (or the font descent, whichever is greater),
+padded to the same horizontal extents as <constant>MaxWidth</constant>.
+All glyph images have the same sized bitmap and share a
+common origin. This is the least compact representation,
+but may be the easiest or most efficient (particularly for
+character cell fonts) for some clients to use. The edges of
+the rectangle are:
+
+<literallayout class="monospaced">
+left: min (<structfield>XFONTINFO.MIN-BOUNDS.LBEARING</structfield>, 0)
+right: max (<structfield>XFONTINFO.MAX-BOUNDS.RBEARING</structfield>,
+ <structfield>XFONTINFO.MAX-BOUNDS.WIDTH</structfield>)
+top: max (<structfield>XFONTINFO.FONT-ASCENT</structfield>,
+ <structfield>XFONTINFO.MAX-BOUNDS.ASCENT</structfield>)
+bottom: max (<structfield>XFONTINFO.FONT-DESCENT</structfield>,
+ <structfield>XFONTINFO.MAX-BOUNDS.DESCENT</structfield>)
+</literallayout>
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<para>
+The <structfield>SCANLINE-PAD</structfield> field specifies the number of
+bits (8, 16, 32,
+or 64) to which each glyph scanline is padded before transmitting.
+It contains one of the following alternate values:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>ScanlinePad8</constant></entry><entry><literal>(0 &lt;&lt; 8)</literal></entry></row>
+ <row><entry><constant>ScanlinePad16</constant></entry><entry><literal>(1 &lt;&lt; 8)</literal></entry></row>
+ <row><entry><constant>ScanlinePad32</constant></entry><entry><literal>(2 &lt;&lt; 8)</literal></entry></row>
+ <row><entry><constant>ScanlinePad64</constant></entry><entry><literal>(3 &lt;&lt; 8)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The <structfield>SCANLINE-UNIT</structfield> field specifies the number of
+bits (8, 16, 32, or 64) that should be treated as a unit for swapping.
+This value must be less than or equal to the number of bits specified by the
+<structfield>SCANLINE-PAD</structfield>. It contains one of the following
+alternate values:
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>ScanlineUnit8</constant></entry><entry><literal>(0 &lt;&lt; 12)</literal></entry></row>
+ <row><entry><constant>ScanlineUnit16</constant></entry><entry><literal>(1 &lt;&lt; 12)</literal></entry></row>
+ <row><entry><constant>ScanlineUnit32</constant></entry><entry><literal>(2 &lt;&lt; 12)</literal></entry></row>
+ <row><entry><constant>ScanlineUnit64</constant></entry><entry><literal>(3 &lt;&lt; 12)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+<link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link>s are byte-swapped as <type>CARD32</type>s.
+All unspecified bits must be zero.
+</para>
+<para>
+Use of an invalid <link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link> causes a
+<link linkend="Errors:Format"><errorname>Format</errorname></link> error to be returned.
+</para>
+</section>
+
+<section id="Data_Types:BITMAPFORMATMASK">
+ <title><type>BITMAPFORMATMASK</type></title>
+ <indexterm zone="Data_Types:BITMAPFORMATMASK" significance="preferred"><primary>BITMAPFORMATMASK</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>BITMAPFORMATMASK</type>:</entry><entry> <type>CARD32</type> mask</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+This is a mask of bits representing the fields in a <link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link>:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>ByteOrderMask</constant></entry><entry><literal>(1 &lt;&lt; 0)</literal></entry></row>
+ <row><entry><constant>BitOrderMask</constant></entry><entry><literal>(1 &lt;&lt; 1)</literal></entry></row>
+ <row><entry><constant>ImageRectMask</constant></entry><entry><literal>(1 &lt;&lt; 2)</literal></entry></row>
+ <row><entry><constant>ScanlinePadMask</constant></entry><entry><literal>(1 &lt;&lt; 3)</literal></entry></row>
+ <row><entry><constant>ScanlineUnitMask</constant></entry><entry><literal>(1 &lt;&lt; 4)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+Unspecified bits are required to be zero or else a
+<link linkend="Errors:Format"><errorname>Format</errorname></link> error is returned.
+</para>
+</section>
+
+<section id="Data_Types:BOOL">
+ <title><type>BOOL</type></title>
+ <indexterm zone="Data_Types:BOOL" significance="preferred"><primary>BOOL</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>BOOL</type>:</entry><entry> <type>CARD8</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+This is a boolean value containing one of the following alternate
+values:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>False</constant></entry><entry><literal>0</literal></entry></row>
+ <row><entry><constant>True</constant></entry><entry><literal>1</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+</section>
+
+<section id="Data_Types:BYTE">
+ <title><type>BYTE</type></title>
+ <indexterm zone="Data_Types:BYTE" significance="preferred"><primary>BYTE</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>BYTE</type>:</entry><entry> 8-bit value</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This is an unsigned byte of data whose encoding
+is determined by the context in which it is used.
+</para>
+
+</section>
+
+<section id="Data_Types:CARDn">
+ <title><type>CARD8</type>, <type>CARD16</type>, <type>CARD32</type></title>
+ <indexterm zone="Data_Types:CARDn" significance="preferred"><primary>CARD8</primary></indexterm>
+ <indexterm zone="Data_Types:CARDn" significance="preferred"><primary>CARD16</primary></indexterm>
+ <indexterm zone="Data_Types:CARDn" significance="preferred"><primary>CARD32</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>CARD8</type>:</entry><entry> 8-bit unsigned integer</entry></row>
+ <row><entry><type>CARD16</type>:</entry><entry> 16-bit unsigned integer</entry></row>
+ <row><entry><type>CARD32</type>:</entry><entry> 32-bit unsigned integer</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+These are unsigned numbers. The latter two are byte-swapped when
+the server and client have different byte orders.
+</para>
+
+</section>
+
+<section id="Data_Types:CHAR2B">
+ <title><type>CHAR2B</type></title>
+ <indexterm zone="Data_Types:CHAR2B" significance="preferred"><primary>CHAR2B</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>CHAR2B</type>:</entry><entry>[ <structfield>byte1</structfield>, <structfield>byte2</structfield>:</entry><entry><type>CARD8</type> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+This structure specifies an individual character code within
+either a 2-dimensional matrix (using <structfield>BYTE1</structfield>
+and <structfield>BYTE2</structfield> as the row and column indices,
+respectively) or a vector (using <structfield>BYTE1</structfield> and
+<structfield>BYTE2</structfield> as most- and least-significant bytes,
+respectively). This data type is treated as a pair of 8-bit values and
+is never byte-swapped. Therefore, the client should always transmit
+<structfield>BYTE1</structfield> first.
+</para>
+
+</section>
+
+<section id="Data_Types:EVENTMASK">
+ <title><type>EVENTMASK</type></title>
+ <indexterm zone="Data_Types:EVENTMASK" significance="preferred"><primary>EVENTMASK</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>EVENTMASK</type>:</entry><entry> <type>CARD32</type> mask</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This is a mask of bits indicating which of an extension's (or the
+core's) maskable events the client would like to receive. Each
+bit indicates one or more events, and a bit value of one indicates
+interest in a corresponding set of events. The following bits are
+defined for event masks specified for the core protocol (i.e. an
+<parameter>EXTENSION-OPCODE</parameter> of zero in
+<link linkend="Requests:SetEventMask"><function>SetEventMask</function></link>
+and
+<link linkend="Requests:GetEventMask"><function>GetEventMask</function></link>
+requests):
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>CatalogueListChangeMask</constant></entry><entry><literal>(1 &lt;&lt; 0)</literal></entry></row>
+ <row><entry><constant>FontListChangeMask</constant></entry><entry><literal>(1 &lt;&lt; 1)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+
+<para>
+If
+<constant>CatalogueListChangeMask</constant>
+is set, client is interested in
+receiving
+<link linkend="Events:CatalogueListNotify"><function>CatalogueListNotify</function></link>
+events. If
+<constant>FontListChangeMask</constant>
+is set, the client is interested in
+receiving
+<link linkend="Events:FontListNotify"><function>FontListNotify</function></link>
+events.
+</para>
+<para>
+Extensions that provide additional events may define their own
+event masks. These event masks have their own scope and may use
+the same bit values as the core or other extensions.
+ </para>
+ <para>
+All unused bits must be set to zero. In
+<link linkend="Requests:SetEventMask"><function>SetEventMask</function></link>
+requests, if
+any bits are set that are not defined for the extension (or core)
+for which this <type>EVENTMASK</type> is intended (according to the
+<parameter>EXTENSION-OPCODE</parameter> given in the
+<link linkend="Requests:SetEventMask"><function>SetEventMask</function></link>
+request), an
+<link linkend="Errors:EventMask"><errorname>EventMask</errorname></link>
+error is generated.
+ </para>
+ <para>
+This value is swapped as a <type>CARD32</type>.
+ </para>
+
+</section>
+
+<section id="Data_Types:FONTID">
+ <title><type>FONTID</type></title>
+ <indexterm zone="Data_Types:FONTID" significance="preferred"><primary>FONTID</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>FONTID</type>:</entry><entry> <link linkend="Data_Types:ID"><type>ID</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This is specified by the client in the request
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+as the identifier to be used when referring to a particular open
+font.
+</para>
+
+</section>
+
+<section id="Data_Types:ID">
+ <title><type>ID</type></title>
+ <indexterm zone="Data_Types:ID" significance="preferred"><primary>ID</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>ID</type>:</entry><entry> <type>CARD32</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+This is a 32-bit value in which the top 3 bits must be clear, and
+at least 1 other bit must be set (yielding a range of 1 through
+2<superscript>29</superscript>-1).
+It is specified by the client to represent objects in
+the server. Identifiers are scoped according to their type are
+private to the client; thus, the same identifier may be used for
+both a <link linkend="Data_Types:FONTID"><type>FONTID</type></link> and an <link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link>
+as well as by multiple clients.
+</para>
+<para>
+An <type>ID</type> of zero is referred to as <constant>None</constant>.
+</para>
+</section>
+
+<section id="Data_Types:INTn">
+ <title><type>INT8</type>, <type>INT16</type>, <type>INT32</type></title>
+ <indexterm zone="Data_Types:INTn" significance="preferred"><primary>INT8</primary></indexterm>
+ <indexterm zone="Data_Types:INTn" significance="preferred"><primary>INT16</primary></indexterm>
+ <indexterm zone="Data_Types:INTn" significance="preferred"><primary>INT32</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>INT8</type>:</entry><entry> 8-bit signed integer</entry></row>
+ <row><entry><type>INT16</type>:</entry><entry> 16-bit signed integer</entry></row>
+ <row><entry><type>INT32</type>:</entry><entry> 32-bit signed integer</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+<para>
+These are signed numbers. The latter two are byte-swapped when
+the client and server have different byte orders.
+</para>
+</section>
+
+<section id="Data_Types:OFFSET32">
+ <title><type>OFFSET32</type></title>
+ <indexterm zone="Data_Types:OFFSET32" significance="preferred"><primary>OFFSET32</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='1'><type>OFFSET32</type>:</entry>
+ <entry>[ <structfield>position</structfield>:</entry><entry><type>CARD32</type>,</entry></row>
+ <row><entry>&emsp;<structfield>length</structfield>:</entry><entry><type>CARD32</type> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This structure indicates a position and length within a block of
+data.
+ </para>
+</section>
+
+<section id="Data_Types:PROPINFO">
+ <title><type>PROPINFO</type></title>
+ <indexterm zone="Data_Types:PROPINFO" significance="preferred"><primary>PROPINFO</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='1'><type>PROPINFO</type>:</entry>
+ <entry>[ <structfield>offsets</structfield>:</entry><entry><link linkend="Data_Types:PROPOFFSET"><type>LISTofPROPOFFSET</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>data</structfield>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure describes the list of properties provided by a
+font. Strings for all of the properties names and values are
+stored within the data block and are located using a table of
+offsets and lengths.
+ </para>
+ <para>
+This structure is padded to 32-bit alignment.
+ </para>
+
+</section>
+
+<section id="Data_Types:PROPOFFSET">
+ <title><type>PROPOFFSET</type></title>
+ <indexterm zone="Data_Types:PROPOFFSET" significance="preferred"><primary>PROPOFFSET</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='3'><type>PROPOFFSET</type>:</entry>
+ <entry>[ <structfield>name</structfield>:</entry><entry><link linkend="Data_Types:OFFSET32"><type>OFFSET32</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>value</structfield>:</entry><entry><link linkend="Data_Types:OFFSET32"><type>OFFSET32</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>type</structfield>:</entry><entry><type>CARD8</type>,</entry></row>
+ <row><entry>&emsp;<structfield>zero-pad3</structfield>:</entry><entry><link linkend="Data_Types:BYTE"><type>BYTE</type></link>, <link linkend="Data_Types:BYTE"><type>BYTE</type></link>, <link linkend="Data_Types:BYTE"><type>BYTE</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure specifies the position, length, and type of
+of data for a property.
+ </para>
+ <para>
+The <structfield>NAME</structfield> field specifies the position and length
+(which must be
+greater than zero) of the property name relative to the beginning
+of the <structfield>PROPINFO.DATA</structfield> block for this font.
+The interpretation of
+the position and length of the <structfield>VALUE</structfield> field is
+determined by the <structfield>TYPE</structfield> field, which contains
+one of the following alternate values:
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>String</constant></entry><entry><literal>0</literal></entry></row>
+ <row><entry><constant>Unsigned</constant></entry><entry><literal>1</literal></entry></row>
+ <row><entry><constant>Signed</constant></entry><entry><literal>2</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+which have the following meanings:
+<variablelist>
+ <varlistentry id="Constant:String">
+ <term><constant>String</constant></term>
+ <listitem>
+ <indexterm zone="Constant:String" significance="preferred"><primary>String</primary></indexterm>
+ <para>
+This property contains a counted string of bytes. The
+data is stored in the <structfield>PROPINFO.DATA</structfield>
+block beginning at
+relative byte VALUE.POSITION (beginning with zero), extending
+for VALUE.LENGTH (at least zero) bytes.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:Unsigned">
+ <term><constant>Unsigned</constant></term>
+ <listitem>
+ <indexterm zone="Constant:Unsigned" significance="preferred"><primary>Unsigned</primary></indexterm>
+ <para>
+This property contains a unsigned, 32-bit number stored
+as a <type>CARD32</type> in VALUE.POSITION (VALUE.LENGTH is zero).
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:Signed">
+ <term><constant>Signed</constant></term>
+ <listitem>
+ <indexterm zone="Constant:Signed" significance="preferred"><primary>Signed</primary></indexterm>
+ <para>
+This property contains a signed, 32-bit number stored as
+an <type>INT32</type> in VALUE.POSITION (VALUE.LENGTH is zero).
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+This structure is zero-padded to 32-bit alignment.
+</para>
+
+</section>
+
+<section id="Data_Types:RANGE">
+ <title><type>RANGE</type></title>
+ <indexterm zone="Data_Types:RANGE" significance="preferred"><primary>RANGE</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>RANGE</type>:</entry>
+ <entry>[ <structfield>min-char</structfield>, <structfield>max-char</structfield>:</entry><entry><link linkend="Data_Types:CHAR2B"><type>CHAR2B</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure specifies a range of character codes. A single
+character is represented by <structfield>MIN-CHAR</structfield> equals
+<structfield>MAX-CHAR</structfield>. If the linear interpretation of
+<structfield>MAX-CHAR</structfield> is less than that of
+<structfield>MIN-CHAR</structfield>, or if
+<structfield>MIN-CHAR</structfield> is less than the font's
+<structfield>XFONTINFO.CHAR-RANGE.MIN-CHAR</structfield>, or if
+<structfield>MAX-CHAR</structfield> is greater than the
+font's <structfield>XFONTINFO.CHAR-RANGE.MAX-CHAR</structfield>,
+the range is invalid.
+ </para>
+
+</section>
+
+<section id="Data_Types:RESOLUTION">
+ <title><type>RESOLUTION</type></title>
+ <indexterm zone="Data_Types:RESOLUTION" significance="preferred"><primary>RESOLUTION</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='2'><type>RESOLUTION</type>:</entry>
+ <entry>[ <structfield>x-resolution</structfield>:</entry><entry><type>CARD16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>y-resolution</structfield>:</entry><entry><type>CARD16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>decipoint-size</structfield>:</entry><entry><type>CARD16</type> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure specifies resolution and point size to be used in
+resolving partially-specified scaled font names. The
+<structfield>X-RESOLUTION</structfield> and
+<structfield>Y-RESOLUTION</structfield> are measured in
+pixels-per-inch and must be greater than zero.
+The <structfield>DECIPOINT-SIZE</structfield> is the preferred font
+size, measured in tenths of a point, and must be greater than zero.
+ </para>
+
+</section>
+
+<section id="Data_Types:STRING8">
+ <title><type>STRING8</type></title>
+ <indexterm zone="Data_Types:STRING8" significance="preferred"><primary>STRING8</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>STRING8</type>:</entry><entry> <type>LISTofCARD8</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This is a counted list of 1-byte character codes, typically
+encoded in <acronym>ISO</acronym> 8859-1. A character code
+<quote><literal>c</literal></quote> is equivalent to a
+<link linkend="Data_Types:CHAR2B"><type>CHAR2B</type></link> structure whose <structfield>BYTE1</structfield>
+is zero and whose <structfield>BYTE2</structfield> is
+<quote><literal>c</literal></quote>.
+ </para>
+
+</section>
+
+<section id="Data_Types:TIMESTAMP">
+ <title><type>TIMESTAMP</type></title>
+ <indexterm zone="Data_Types:TIMESTAMP" significance="preferred"><primary>TIMESTAMP</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><type>TIMESTAMP</type>:</entry><entry> <type>CARD32</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This is the number of milliseconds that have passed since a
+server-dependent origin. It is provided in errors and events and is
+permitted to wrap.
+ </para>
+</section>
+
+<section id="Data_Types:XCHARINFO">
+ <title><type>XCHARINFO</type></title>
+ <indexterm zone="Data_Types:XCHARINFO" significance="preferred"><primary>XCHARINFO</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='3'><type>XCHARINFO</type>:</entry>
+ <entry>[ <structfield>lbearing</structfield>, <structfield>rbearing</structfield>:</entry><entry><type>INT16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>width</structfield>:</entry><entry><type>INT16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>ascent</structfield>, <structfield>descent</structfield>:</entry><entry><type>INT16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>attributes</structfield>:</entry><entry><type>CARD16</type> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This structure specifies the ink extents and horizontal escapement
+(also known as the set- or logical width) of an individual
+character. The first five values represent directed distances in
+a coordinate system whose origin is aligned with the lower-left
+edge of the left-most pixel of the glyph baseline (i.e. the
+baseline falls between two pixels as shown in Figure 3-1 of the
+<citetitle>Bitmap Distribution Format 2.1</citetitle> Consortium standard
+<xref linkend="References:bdf-spec"/>).
+ </para>
+ <para>
+The <structfield>LBEARING</structfield> field specifies the
+directed distance measured to the
+right from the origin to the left edge of the left-most inked
+pixel in the glyph.
+ </para>
+ <para>
+The <structfield>RBEARING</structfield> field specifies the
+directed distance (measured to
+the right) from the origin to the right edge of the right-most
+inked pixel in the glyph.
+ </para>
+ <para>
+The <structfield>WIDTH</structfield> field specifies the
+directed distance (measured to the
+right) from the origin to the position where the next character
+should appear (called the <firstterm>escapement point</firstterm>). This
+distance includes any whitespace used for intercharacter padding and is
+also referred to as the <firstterm>logical width</firstterm> or
+<firstterm>horizontal escapement</firstterm>.
+<indexterm zone="Data_Types:XCHARINFO" significance="preferred"><primary>horizontal escapement</primary></indexterm>
+ </para>
+ <para>
+The <structfield>ASCENT</structfield> field specifies the
+directed distance (measured up)
+from the baseline to the top edge of the top-most inked pixel
+in the glyph.
+ </para>
+ <para>
+The <structfield>DESCENT</structfield> field specifies the
+directed distance (measured
+down) from the baseline to the bottom edge of the bottom-most
+inked pixel.
+ </para>
+ <para>
+The <structfield>ATTRIBUTES</structfield> field specifies
+glyph-specific information that
+is passed through the application. If this value is not being
+used, it should be zero.
+ </para>
+ <para>
+The ink bounding box of a glyph is defined to be the smallest
+rectangle that encloses all of the inked pixels. This box has
+a width of
+<structfield>RBEARING</structfield> &minus; <structfield>LBEARING</structfield>
+pixels and a height of
+<structfield>ASCENT</structfield> + <structfield>DESCENT</structfield> pixels.
+ </para>
+</section>
+
+<section id="Data_Types:XFONTINFO">
+ <title><type>XFONTINFO</type></title>
+ <indexterm zone="Data_Types:XFONTINFO" significance="preferred"><primary>XFONTINFO</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry morerows='8'><type>XFONTINFO</type>:</entry>
+ <entry>[ <structfield>flags</structfield>:</entry><entry><type>CARD32</type>,</entry></row>
+ <row><entry>&emsp;<structfield>drawing-direction</structfield>:</entry><entry>{ <constant>LeftToRight</constant>, <constant>RightToLeft</constant> }</entry></row>
+ <row><entry>&emsp;<structfield>char-range</structfield>:</entry><entry><link linkend="Data_Types:RANGE"><type>RANGE</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>default-char</structfield>:</entry><entry><link linkend="Data_Types:CHAR2B"><type>CHAR2B</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>min-bounds</structfield>:</entry><entry><link linkend="Data_Types:XCHARINFO"><type>XCHARINFO</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>max-bounds</structfield>:</entry><entry><link linkend="Data_Types:XCHARINFO"><type>XCHARINFO</type></link>,</entry></row>
+ <row><entry>&emsp;<structfield>font-ascent</structfield>:</entry><entry><type>INT16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>font-descent</structfield>:</entry><entry><type>INT16</type>,</entry></row>
+ <row><entry>&emsp;<structfield>properties</structfield>:</entry><entry><link linkend="Data_Types:PROPINFO"><type>PROPINFO</type></link> ]</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This structure specifies attributes related to the font as a
+whole.
+ </para>
+ <para>
+The <structfield>FLAGS</structfield> field is a bit mask containing zero
+or more of the following boolean values (unspecified bits must be zero):
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>AllCharactersExist</constant></entry><entry><literal>(1 &lt;&lt; 0)</literal></entry></row>
+ <row><entry><constant>InkInside</constant></entry><entry><literal>(1 &lt;&lt; 1)</literal></entry></row>
+ <row><entry><constant>HorizontalOverlap</constant></entry><entry><literal>(1 &lt;&lt; 2)</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+which have the following meanings:
+<variablelist>
+ <varlistentry id="Constant:AllCharactersExist">
+ <term><constant>AllCharactersExist</constant></term>
+ <listitem>
+ <indexterm zone="Constant:AllCharactersExist" significance="preferred"><primary>AllCharactersExist</primary></indexterm>
+ <para>
+If this bit is set, all of the characters in the range given by
+<structfield>CHAR-RANGE</structfield> have glyphs encoded in
+the font. If this bit is clear, some of the characters
+may not have encoded glyphs.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:InkInside">
+ <term><constant>InkInside</constant></term>
+ <listitem>
+ <indexterm zone="Constant:InkInside" significance="preferred"><primary>InkInside</primary></indexterm>
+ <para>
+If this bit is set, the inked pixels of each glyph
+fall within the rectangle described by the font's ascent,
+descent, origin, and the glyph's escapement point. If
+this bit is clear, there may be glyphs whose ink extends
+outside this rectangle.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="Constant:HorizontalOverlap">
+ <term><constant>HorizontalOverlap</constant></term>
+ <listitem>
+ <indexterm zone="Constant:HorizontalOverlap" significance="preferred"><primary>HorizontalOverlap</primary></indexterm>
+ <para>
+If this bit is set, the two ink bounding
+boxes (smallest rectangle enclosing the inked pixels) of
+some pairs of glyphs in the font may overlap when displayed
+side-by-side (i.e. the second character is imaged at the
+escapement point of the first) on a common baseline. If
+this bit is clear, there are no pairs of glyphs whose ink
+bounding boxes overlap.
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<para id="Data_Types:XFONTINFO.DRAWING-DIRECTION">
+ <indexterm zone="Data_Types:XFONTINFO.DRAWING-DIRECTION" significance="preferred"><primary>LeftToRight</primary></indexterm>
+ <indexterm zone="Data_Types:XFONTINFO.DRAWING-DIRECTION" significance="preferred"><primary>RightToLeft</primary></indexterm>
+The <structfield>DRAWING-DIRECTION</structfield> field contains a hint
+indicating whether most of the character metrics have a positive (or
+<quote><constant>LeftToRight</constant></quote>) logical width or a
+negative (<quote><constant>RightToLeft</constant></quote>) logical width. It
+contains the following alternate values:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>LeftToRight</constant></entry><entry><literal>0</literal></entry></row>
+ <row><entry><constant>RightToLeft</constant></entry><entry><literal>1</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The <structfield>CHAR-RANGE.MIN-CHAR</structfield>
+and <structfield>CHAR-RANGE.MAX-CHAR</structfield> fields specify the
+first and last character codes that have glyphs encoded in this font.
+All fonts must have at least one encoded glyph (in which case the
+<structfield>MIN-CHAR</structfield> and <structfield>MAX-CHAR</structfield>
+are equal), but are not required to have glyphs
+encoded at all positions between the first and last characters.
+</para>
+<para>
+The <structfield>DEFAULT-CHAR</structfield> field specifies
+the character code of the glyph
+that the client should substitute for unencoded characters. Requests
+for extents or bitmaps for an unencoded character generate zero-filled
+metrics and a zero-length glyph bitmap, respectively.
+</para>
+<para>
+The <structfield>MIN-BOUNDS</structfield> and
+<structfield>MAX-BOUNDS</structfield> fields contain the minimum and maximum
+values of each of the extents field of all encoded characters in the
+font (i.e. non-existent characters are ignored).
+</para>
+<para>
+The <structfield>FONT-ASCENT</structfield> and
+<structfield>FONT-DESCENT</structfield> fields specify the font designer's
+logical height of the font, above and below the baseline,
+respectively. The sum of the two values is often used as the
+vertical line spacing of the font. Individual glyphs are permitted
+to have ascents and descents that are greater than these values.
+</para>
+<para>
+The <structfield>PROPERTIES</structfield> field contains the
+property data associated with this font.
+</para>
+<para>
+This structure is padded to 32-bit alignment.
+</para>
+</section>
+</section>
+
+<section id='Requests'>
+<title>Requests</title>
+<!-- .XS -->
+<!-- (SN Requests -->
+<!-- .XE -->
+<para>
+This section describes the requests that may be sent by the client and the
+replies or errors that are generated in response. Versions of the protocol
+with the same major version are required to be upward-compatible.
+</para>
+<para>
+Every request on a given connection is implicitly assigned a sequence number,
+starting with 1, that is used in replies, error, and events. Servers are
+required to generate replies and errors in the order in which the corresponding
+requests are received. Servers are permitted to add or remove fonts to the
+list visible to the client between any two requests, but requests must be
+processed atomically. Each request packet is at least 4 bytes long and
+contains the following fields:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>major-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>minor-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>length</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+
+The <parameter>MAJOR-OPCODE</parameter> specifies which core request or
+extension package this packet represents. If the
+<parameter>MAJOR-OPCODE</parameter> corresponds to a core request, the
+<parameter>MINOR-OPCODE</parameter> contains 8 bits of request-specific data.
+Otherwise, the <parameter>MINOR-OPCODE</parameter> specifies which extension
+request this packet represents. The <parameter>LENGTH</parameter> field
+specifies the number of 4-byte units contained within the packet
+and must be at least one. If this field contains a value greater than one it
+is followed by (<parameter>LENGTH</parameter> - 1) * 4 bytes
+of request-specific data. Unless
+otherwise specified, unused bytes are not required to be zero.
+</para>
+<para>
+If a request packet contains too little or too much data, the server returns
+a <link linkend="Errors:Length"><errorname>Length</errorname></link> error.
+If the server runs out of internal
+resources (such as memory) while processing a request, it returns an
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link> error.
+If a server is deficient (and therefore non-compliant) and is unable to
+process a request, it may return an
+<link linkend="Errors:Implementation"><errorname>Implementation</errorname></link> error.
+If a client uses an extension request without previously having issued a
+<link linkend="Requests:QueryExtension"><function>QueryExtension</function></link>
+request for that extension, the server responds with a
+<link linkend="Errors:Request"><errorname>Request</errorname></link>
+error. If the server encounters a request with an unknown
+<parameter>MAJOR-OPCODE</parameter> or <parameter>MINOR-OPCODE</parameter>,
+it responds with a
+<link linkend="Errors:Request"><errorname>Request</errorname></link>
+error.
+At most one error is generated per request. If more than one error condition
+is encountered in processing a requests, the choice of which error is returned
+is server-dependent.
+</para>
+<para>
+Core requests have <parameter>MAJOR-OPCODE</parameter> values between 0 and
+127, inclusive. Extension requests have <parameter>MAJOR-OPCODE</parameter>
+values between 128 and 255, inclusive, that are assigned by by the server.
+All <parameter>MINOR-OPCODE</parameter> values in extension requests are
+between 0 and 255, inclusive.
+</para>
+<para>
+Each reply is at least 8 bytes long and contains the following fields:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>type</parameter>:</entry><entry><type>CARD8</type></entry><entry>value of 0</entry></row>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>sequence-number</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>length</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The <parameter>TYPE</parameter> field has a value of zero.
+The <parameter>DATA-OR-UNUSED</parameter> field may be used to
+encode one byte of reply-specific data (see
+<link linkend="Encoding::Requests">Section 5.2 on request encoding</link>).
+The least-significant 16 bits of the sequence number of the request that
+generated the reply are stored in the <parameter>SEQUENCE-NUMBER</parameter>
+field. The <parameter>LENGTH</parameter> field specifies the number of
+4-byte units in this reply packet, including the fields described above,
+and must be at least two. If <parameter>LENGTH</parameter> is greater
+than two, the fields described above are followed by
+(<parameter>LENGTH</parameter> - 2) * 4 bytes of additional data.
+</para>
+<para>
+Requests that have replies are described using the following syntax:
+ <blockquote><para>
+ <emphasis role="bold"><function>RequestName</function></emphasis>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>arg1</parameter>:</entry><entry><type>type1</type></entry></row>
+ <row><entry><parameter>arg2</parameter>:</entry><entry><type>type2</type></entry></row>
+ <row><entry> ...</entry></row>
+ <row><entry><parameter>argN</parameter>:</entry><entry><type>typeN</type></entry></row>
+ <row><entry> ▶</entry></row>
+ <row><entry><parameter>result1</parameter>:</entry><entry><type>type1</type></entry></row>
+ <row><entry><parameter>result2</parameter>:</entry><entry><type>type2</type></entry></row>
+ <row><entry> ...</entry></row>
+ <row rowsep="1"><entry><parameter>resultM</parameter>:</entry><entry><type>typeM</type></entry></row>
+ <row><entry>Errors:</entry><entry><errorname>kind1</errorname>, <errorname>kind2</errorname> ..., <errorname>kindK</errorname></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ Description
+ </para></blockquote>
+</para>
+<para>
+If a request does not generate a reply, the ▶ and result lines are
+omitted. If a request may generate multiple replies, the ▶ is replaced by
+a ▶+. In the authorization data exchanges in the initial connection setup
+and the CreateAC request, ◀ indicates data sent by the client in response
+to data sent by the server.
+</para>
+<para>
+The protocol begins with the establishment of a connection over a
+mutually-understood virtual stream:
+</para>
+
+<section id="Requests:open_connection">
+ <title>open connection</title>
+ <indexterm zone="Requests:open_connection" significance="preferred"><primary>open connection</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='2.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>byte-order</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>BYTE</type></link></entry></row>
+ <row><entry><parameter>client-major-protocol-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>client-minor-protocol-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>authorization-protocols</parameter>:</entry><entry><link linkend="Data_Types:AUTH"><type>LISTofAUTH</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+The initial byte of the connection specifies the
+<parameter>BYTE-ORDER</parameter> in
+which subsequent 16-bit and 32-bit numeric values are to be
+transmitted. The octal value <literal>102</literal>
+(<acronym>ASCII</acronym> uppercase <quote><literal>B</literal></quote>)
+indicates that the most-significant byte is to be transmitted
+first; the octal value <literal>154</literal>
+(<acronym>ASCII</acronym> lowercase <quote><literal>l</literal></quote>)
+indicates that the least-significant byte is to be transmitted first.
+If any other value is encountered the server closes the
+connection without any response.
+</para>
+ <para>
+The <parameter>CLIENT-MAJOR-PROTOCOL-VERSION</parameter> and
+<parameter>CLIENT-MINOR-PROTOCOL-VERSION</parameter> specify
+which version of the
+font service protocol the client would like to use. If the
+client can support multiple versions, the highest version
+should be given. This version of the protocol has a
+major version of 2 and a minor version of 0.
+ </para>
+ <para>
+The <parameter>AUTHORIZATION-PROTOCOLS</parameter>
+contains a list of protocol names and
+optional initial data for which the client can provide
+information. The server may use this to determine which
+protocol to use or as part of the initial exchange of
+authorization data.
+ </para>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='2.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>status</parameter>:</entry><entry>{ <constant>Success</constant>, <constant>Continue</constant>,
+ <constant>Busy</constant>, <constant>Denied</constant> }</entry></row>
+ <row><entry><parameter>server-major-protocol-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>server-minor-protocol-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>alternate-servers-hint</parameter>:</entry><entry><link linkend="Data_Types:ALTERNATESERVER"><type>LISTofALTERNATESERVER</type></link></entry></row>
+ <row><entry><parameter>authorization-index</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>authorization-data</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+The <parameter>SERVER-MAJOR-PROTOCOL-VERSION</parameter> and
+<parameter>SERVER-MINOR-PROTOCOL-VERSION</parameter> specify
+the version of the font
+service protocol that the server expects from the client. If
+the server supports the version specified by the client, this
+version number should be returned. If the client has
+requested a higher version than is supported by the server,
+the server's highest version should be returned. Otherwise,
+if the client has requested a lower version than is supported
+by the server, the server's lowest version should be returned.
+It is the client's responsibility to decide whether or not it
+can match this version of the protocol.
+ </para>
+ <para>
+The <parameter>ALTERNATE-SERVERS-HINT</parameter>
+is a list of other font servers
+that may have related sets of fonts (determined by means
+outside this protocol, typically by the system administrator).
+Clients may choose to contact these font servers if the
+connection is rejected or lost.
+ </para>
+ <para>
+The <parameter>STATUS</parameter> field indicates whether the server accepted,
+rejected, or would like more information about the connection.
+It has one of the following alternate values:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='2.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><constant>Success</constant></entry><entry><literal>0</literal></entry></row>
+ <row><entry><constant>Continue</constant></entry><entry><literal>1</literal></entry></row>
+ <row><entry><constant>Busy</constant></entry><entry><literal>2</literal></entry></row>
+ <row><entry><constant>Denied</constant></entry><entry><literal>3</literal></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ <para>
+If <parameter>STATUS</parameter> is <constant>Denied</constant>,
+the server has rejected the client's authorization information.
+If <parameter>STATUS</parameter> is <constant>Busy</constant>, the server has
+simply decided that it cannot provide fonts to this client at
+this time (it may be able to at a later time). In both cases,
+<parameter>AUTHORIZATION-INDEX</parameter> is set to zero,
+no authorization-data is
+returned, and the server closes the connection after sending
+the data described so far.
+ </para>
+ <para>
+Otherwise the <parameter>AUTHORIZATION-INDEX</parameter> is set to the index
+(beginning with 1) into the <parameter>AUTHORIZATION-PROTOCOLS</parameter>
+list of the protocol that the server will use for this connection. If
+the server does not want to use any of the given protocols,
+this value is set to zero. The <parameter>AUTHORIZATION-DATA</parameter>
+field is used to send back authorization protocol-dependent data to the
+client (such as a challenge, authentication of the server,
+etc.).
+ </para>
+<para>
+If <parameter>STATUS</parameter> is <constant>Success</constant>,
+the following section of protocol is omitted. Otherwise, if
+<parameter>STATUS</parameter> is <constant>Continue</constant>,
+the server expects
+more authorization data from the client (i.e. the connection
+setup is not finished, so no requests or events may be sent):
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>◀</entry></row>
+ <row><entry><parameter>more-authorization-data</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>status</parameter>:</entry><entry>{ <constant>Success</constant>, <constant>Continue</constant>, <constant>Busy</constant>, <constant>Denied</constant> }</entry></row>
+ <row><entry><parameter>more-authorization-data</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The values in <parameter>STATUS</parameter> have the same meanings as described
+above. This section of protocol is repeated until the server
+either accepts (sets <parameter>STATUS</parameter> to
+<constant>Success</constant>) or rejects (sets <parameter>STATUS</parameter>
+to <constant>Denied</constant> or <constant>Busy</constant>) the connection.
+</para>
+<para>
+Once the connection has been accepted and <parameter>STATUS</parameter>
+is <constant>Success</constant>,
+an implicit AccessContext is created for the authorization
+data and the protocol continues with the following data sent
+from the server:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>remaining-length</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>maximum-request-length</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>release-number</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>vendor</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The <parameter>REMAINING-LENGTH</parameter> specifies the length in 4-byte
+units of the remaining data to be transmitted to the client. The
+<parameter>MAXIMUM-REQUEST-LENGTH</parameter> specifies the largest request
+size in 4-byte units that is accepted by the server and must have a
+value of at least 4096. Requests with a length field larger
+than this value are ignored and a
+<link linkend="Errors:Length"><errorname>Length</errorname></link>
+error is returned.
+The <parameter>VENDOR</parameter> string specifies the name of the
+manufacturer of the font server. The
+<parameter>RELEASE-NUMBER</parameter> specifies the particular
+release of the server in a manufacturer-dependent manner.
+</para>
+</section>
+<section><title />
+<para>
+After the connection is established and the setup information has been
+exchanged, the client may issue any of requests described below:
+</para>
+</section>
+<section id="Requests:NoOp">
+ <title><function>NoOp</function></title>
+ <indexterm zone="Requests:NoOp" significance="preferred"><primary>NoOp</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request does nothing. It is typically used in response
+to a
+<link linkend="Events:KeepAlive"><function>KeepAlive</function></link>
+event.
+ </para>
+</section>
+
+<section id="Requests:ListExtensions">
+ <title><function>ListExtensions</function></title>
+ <indexterm zone="Requests:ListExtensions" significance="preferred"><primary>ListExtensions</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>names</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>LISTofSTRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+This request returns the names of the extension packages
+that are supported by the server. Extension names are
+case-sensitive and are encoded in <acronym>ISO</acronym> 8859-1.
+ </para>
+
+</section>
+
+<section id="Requests:QueryExtension">
+ <title><function>QueryExtension</function></title>
+ <indexterm zone="Requests:QueryExtension" significance="preferred"><primary>QueryExtension</primary></indexterm>
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>name</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>present</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>major-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>minor-version</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>major-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>first-event</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>number-events</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>first-error</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row rowsep='1'><entry><parameter>number-errors</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request determines whether or not the extension package specified by
+<parameter>NAME</parameter> (encoded in <acronym>ISO</acronym> 8859-1) is
+supported by the server and that there is sufficient number of major opcode,
+event, and error codes available. If so, then <parameter>PRESENT</parameter>
+is set to <constant>True</constant>, <parameter>MAJOR-VERSION</parameter>
+and <parameter>MINOR-VERSION</parameter> are set to the
+respective major and minor version numbers of the protocol
+that the server would prefer; <parameter>MAJOR-OPCODE</parameter> is set to
+the value to use in extension requests; <parameter>FIRST-EVENT</parameter>
+is set to the value of the first extension-specific event code or zero if the
+extension does not have any events; <parameter>NUMBER-EVENTS</parameter> is
+set to the number of new events that the event defines;
+<parameter>FIRST-ERROR</parameter>
+is set to the value of the first extension-specific error code
+or zero if the extension does not define any new errors; and
+<parameter>NUMBER-ERRORS</parameter> is set to the number of
+new errors the extension defines.
+ </para>
+ <para>
+Otherwise, <parameter>PRESENT</parameter> is set to
+<constant>False</constant> and the remaining fields are
+set to zero.
+ </para>
+ <para>
+The server is free to return different values to different
+clients. Therefore, clients must use this request before
+issuing any of the requests in the named extension package or
+using the
+<link linkend="Requests:SetEventMask"><function>SetEventMask</function></link> request to express interest in any of
+this extension's events. Otherwise, a
+<link linkend="Errors:Request"><errorname>Request</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:ListCatalogues">
+ <title><function>ListCatalogues</function></title>
+ <indexterm zone="Requests:ListCatalogues" significance="preferred"><primary>ListCatalogues</primary></indexterm>
+
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>max-names</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry>▶+</entry></row>
+ <row><entry><parameter>replies-following-hint</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row rowsep='1'><entry><parameter>names</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>LISTofSTRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns a list of at most <parameter>MAX-NAMES</parameter> names
+of collections (called catalogues) of fonts that match
+the specified <parameter>PATTERN</parameter>. In the pattern (which is encoded
+in <acronym>ISO</acronym> 8859-1), the
+<quote><literal>?</literal></quote> character (octal <literal>77</literal>)
+matches any single character; the
+<quote><literal>*</literal></quote> character (octal <literal>52</literal>)
+matches any series of zero or more characters; and alphabetic
+characters match either upper- or lowercase. The
+returned <parameter>NAMES</parameter> are encoded in
+<acronym>ISO</acronym> 8859-1 and may contain
+mixed character cases.
+ </para>
+ <para>
+If <parameter>PATTERN</parameter> is of zero length or
+<parameter>MAX-NAMES</parameter> is equal to zero,
+one reply containing a zero-length list of names is returned.
+This may be used to synchronize the client with the server.
+ </para>
+ <para>
+Servers are free to add or remove catalogues to the set returned by
+<function>ListCatalogues</function>
+between any two requests. This request is not
+cumulative; repeated uses are processed in isolation and do
+result in an iteration through the list.
+ </para>
+ <para>
+To reduce the amount of buffering needed by the server, the
+list of names may be split across several reply packets, so
+long as the names arrive in the same order that they would
+have appeared had they been in a single packet. The
+<parameter>REPLIES-FOLLOWING-HINT</parameter> field in all but the last reply
+contains a positive value that specifies the number of
+replies that are likely, but not required, to follow. In the
+last reply, which may contain zero or more names, this field
+is set to zero.
+ </para>
+</section>
+
+<section id="Requests:SetCatalogues">
+ <title><function>SetCatalogues</function></title>
+ <indexterm zone="Requests:SetCatalogues" significance="preferred"><primary>SetCatalogues</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row rowsep='1'><entry><parameter>names</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>LISTofSTRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link>,
+<link linkend="Errors:Name"><errorname>Name</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request sets the list of catalogues whose fonts should be
+visible to the client. The union of the fonts provided by
+each of the named catalogues forms the set of fonts whose
+names match patterns in
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>,
+<link linkend="Requests:ListFontsWithXInfo"><function>ListFontsWithXInfo</function></link>,
+and
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+requests. The catalogue names are
+case-insensitive and are encoded in <acronym>ISO</acronym> 8859-1. A zero-length
+list resets the client's catalogue list to the
+server-dependent default.
+ </para>
+ <para>
+If any of the catalogue names are invalid, a
+<link linkend="Errors:Name"><errorname>Name</errorname></link>
+error is returned and the request is ignored.
+ </para>
+</section>
+
+<section id="Requests:GetCatalogues">
+ <title><function>GetCatalogues</function></title>
+ <indexterm zone="Requests:GetCatalogues" significance="preferred"><primary>GetCatalogues</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>names</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>LISTofSTRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns the current list of catalogue names
+(encoded in <acronym>ISO</acronym> 8859-1) associated with the client. These
+catalogues determine the set of fonts that are visible
+to
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>,
+<link linkend="Requests:ListFontsWithXInfo"><function>ListFontsWithXInfo</function></link>,
+and
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>.
+A zero-length list indicates the server's default set of
+fonts. Catalogue names are case-insensitive and may be
+returned in mixed case.
+ </para>
+</section>
+
+<section id="Requests:SetEventMask">
+ <title><function>SetEventMask</function></title>
+ <indexterm zone="Requests:SetEventMask" significance="preferred"><primary>SetEventMask</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>extension-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row rowsep='1'><entry><parameter>event-mask</parameter>:</entry><entry><link linkend="Data_Types:EVENTMASK"><type>EVENTMASK</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:EventMask"><errorname>EventMask</errorname></link>,
+<link linkend="Errors:Request"><errorname>Request</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request specifies the set of maskable events that the
+extension indicated by <parameter>EXTENSION-OPCODE</parameter>
+(or zero for the core)
+should generate for the client. Event masks are limited in
+scope to the extension (or core) for which they are defined,
+so expressing interest in events from one or more extensions
+requires multiple uses of this request.
+ </para>
+ <para>
+The default event mask if
+<function>SetEventMask</function>
+has not been called
+is zero, indicating no interest in any maskable events.
+Some events are not maskable and cannot be blocked.
+ </para>
+ <para>
+If <parameter>EXTENSION-OPCODE</parameter> is not a valid extension
+opcode previously returned by
+<link linkend="Requests:QueryExtension"><function>QueryExtension</function></link>
+or zero, a
+<link linkend="Errors:Request"><errorname>Request</errorname></link>
+error is
+returned. If <parameter>EVENT-MASK</parameter> contains any bits that do not
+correspond to valid events for the specified extension (or
+core), an
+<link linkend="Errors:EventMask"><errorname>EventMask</errorname></link>
+error is returned and the request is
+ignored.
+ </para>
+</section>
+
+<section id="Requests:GetEventMask">
+ <title><function>GetEventMask</function></title>
+ <indexterm zone="Requests:GetEventMask" significance="preferred"><primary>GetEventMask</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>extension-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>event-mask</parameter>:</entry><entry><link linkend="Data_Types:EVENTMASK"><type>EVENTMASK</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Request"><errorname>Request</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns the set of maskable core events the
+extension indicated by <parameter>EXTENSION-OPCODE</parameter>
+(or the core if zero)
+should generate for the client. Non-maskable events are
+always sent to the client.
+ </para>
+ <para>
+If <parameter>EXTENSION-OPCODE</parameter> is not a valid extension opcode
+previously returned by
+<link linkend="Requests:QueryExtension"><function>QueryExtension</function></link>
+or zero, a
+<link linkend="Errors:Request"><errorname>Request</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:CreateAC">
+ <title><function>CreateAC</function></title>
+ <indexterm zone="Requests:CreateAC" significance="preferred"><primary>CreateAC</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>ac</parameter>:</entry><entry><link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link></entry></row>
+ <row><entry><parameter>authorization-protocols</parameter>:</entry><entry><link linkend="Data_Types:AUTH"><type>LISTofAUTH</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>status</parameter>:</entry><entry>{ <constant>Success</constant>, <constant>Continue</constant>, <constant>Denied</constant> }</entry></row>
+ <row><entry><parameter>authorization-index</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row rowsep='1'><entry><parameter>authorization-data</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:IDChoice"><errorname>IDChoice</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request creates a new
+<type>AccessContext</type>
+object within the
+server containing the specified authorization data. When
+this
+<type>AccessContext</type>
+is selected by the client using the
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+request, the data may be used by the server
+to determine whether or not the client should be granted
+access to particular font information.
+ </para>
+ <para>
+If <parameter>STATUS</parameter> is <constant>Denied</constant>, the server
+rejects the client's authorization information and does not associate
+<parameter>AC</parameter> with any valid <type>AccessContext</type>.
+In this case, <parameter>AUTHORIZATION-INDEX</parameter> is set
+to zero, and zero bytes of <parameter>AUTHORIZATION-DATA</parameter>
+is returned.
+ </para>
+ <para>
+Otherwise, <parameter>AUTHORIZATION-INDEX</parameter> is set to the index
+(beginning with 1) into the <parameter>AUTHORIZATION-PROTOCOLS</parameter>
+list of the protocol
+that the server will use for this connection. If the server
+does not want to use any of the given protocols, this value is
+set to zero. The <parameter>AUTHORIZATION-DATA</parameter> field is used
+to send back authorization protocol-dependent data to the client (such
+as a challenge, authentication of the server, etc.).
+ </para>
+ <para>
+If <parameter>STATUS</parameter> is <constant>Continue</constant>,
+the client is expected to continue
+the request by sending the following protocol and receiving
+the indicated response from the server. This continues
+until <parameter>STATUS</parameter> is set to either
+<constant>Success</constant> or <constant>Denied</constant>.
+ </para>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry> ◀</entry></row>
+ <row><entry><parameter> more-authorization-data</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry> ▶</entry></row>
+ <row><entry><parameter>status</parameter>:</entry><entry>{ <constant>Success</constant>, <constant>Continue</constant>, <constant>Denied</constant> }</entry></row>
+ <row><entry><parameter> more-authorization-data</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+Once the connection has been accepted and <parameter>STATUS</parameter>
+is <constant>Success</constant>, the request is complete.
+ </para>
+ <para>
+If <parameter>AC</parameter> is not in the range
+[1..2<superscript>29</superscript>-1] or is already associated
+with an access context, an <link linkend="Errors:IDChoice"><errorname>IDChoice</errorname></link> error is returned.
+ </para>
+</section>
+
+<section id="Requests:FreeAC">
+ <title><function>FreeAC</function></title>
+ <indexterm zone="Requests:FreeAC" significance="preferred"><primary>FreeAC</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>ac</parameter>:</entry><entry><link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link></entry></row>
+ <row rowsep='1'><entry>Errors:</entry><entry><link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request indicates that the specified <parameter>AC</parameter> should
+no longer be associated with a valid access context.
+If <parameter>AC</parameter> is also the current
+<type>AccessContext</type>
+(as set by the
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+request), an implicit
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+of <constant>None</constant> is done to
+restore the
+<type>AccessContext</type>
+established for the initial
+connection setup. Operations on fonts that were opened under
+<parameter>AC</parameter> are not affected. The client may reuse the
+value of <parameter>AC</parameter> in a subsequent
+<link linkend="Requests:CreateAC"><function>CreateAC</function></link>
+request.
+ </para>
+ <para>
+If <parameter>AC</parameter> isn't associated with any valid authorization
+previously created by
+<link linkend="Requests:CreateAC"><function>CreateAC</function></link>, an
+<link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:SetAuthorization">
+ <title><function>SetAuthorization</function></title>
+ <indexterm zone="Requests:SetAuthorization" significance="preferred"><primary>SetAuthorization</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>ac</parameter>:</entry><entry><link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link></entry></row>
+ <row rowsep='1'><entry>Errors:</entry><entry><link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request sets the
+<type>AccessContext</type>
+to be used for subsequent
+requests (except for
+<link linkend="Requests:QueryXInfo"><function>QueryXInfo</function></link>,
+<link linkend="Requests:QueryXExtents8"><function>QueryXExtents8</function></link>,
+<link linkend="Requests:QueryXExtents16"><function>QueryXExtents16</function></link>,
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>,
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+and
+<link linkend="Requests:CloseFont"><function>CloseFont</function></link>
+which are done under the
+<type>AccessContext</type>
+of the
+corresponding
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+).
+An <parameter>AC</parameter> of <constant>None</constant> restores the
+<type>AccessContext</type>
+established for the initial connection setup.
+ </para>
+ <para>
+If <parameter>AC</parameter> is neither <constant>None</constant>
+nor a value associated with a valid <type>AccessContext</type>
+previously created by
+<link linkend="Requests:CreateAC"><function>CreateAC</function></link>,
+an
+<link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:SetResolution">
+ <title><function>SetResolution</function></title>
+ <indexterm zone="Requests:SetResolution" significance="preferred"><primary>SetResolution</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row rowsep='1'><entry><parameter>resolutions</parameter>:</entry><entry><link linkend="Data_Types:RESOLUTION"><type>LISTofRESOLUTION</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Resolution"><errorname>Resolution</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request provides a hint as to the resolution and
+preferred point size of the drawing surfaces for which the
+client will be requesting fonts. The server may use this
+information to set the RESOLUTION_X and RESOLUTION_Y fields
+of scalable <acronym>XLFD</acronym> font names, to order sets of names based on
+their resolutions, and to choose the server-dependent
+instance that is used when a partially-specified scalable
+fontname is opened.
+ </para>
+ <para>
+If a zero-length list of <link linkend="Data_Types:RESOLUTION"><type>RESOLUTION</type></link>s is given, the
+server-dependent default value is restored. Otherwise, if
+elements of all of the specified <link linkend="Data_Types:RESOLUTION"><type>RESOLUTION</type></link>s are non-zero, the
+default resolutions for this client are changed.
+ </para>
+ <para>
+If a <link linkend="Data_Types:RESOLUTION"><type>RESOLUTION</type></link> entry contains a zero,
+a <link linkend="Errors:Resolution"><errorname>Resolution</errorname></link> error is
+returned and the default resolutions are not changed.
+ </para>
+</section>
+
+<section id="Requests:GetResolution">
+ <title><function>GetResolution</function></title>
+ <indexterm zone="Requests:GetResolution" significance="preferred"><primary>GetResolution</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>resolutions</parameter>:</entry><entry><link linkend="Data_Types:RESOLUTION"><type>LISTofRESOLUTION</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns the current list of default resolutions.
+If a client has not performed a
+<link linkend="Requests:SetResolution"><function>SetResolution</function></link>,
+a server-dependent default value is returned.
+ </para>
+</section>
+
+<section id="Requests:ListFonts">
+ <title><function>ListFonts</function></title>
+ <indexterm zone="Requests:ListFonts" significance="preferred"><primary>ListFonts</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>max-names</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry>▶+</entry></row>
+ <row><entry><parameter>replies-following-hint</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row rowsep='1'><entry><parameter>names</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>LISTofSTRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns a list of at most <parameter>MAX-NAMES</parameter>
+font names that match the specified <parameter>PATTERN</parameter>,
+according to matching rules
+of the <olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical
+Font Description Conventions</citetitle></olink>
+<xref linkend="References:xlfd-spec"/>.
+In the pattern (which is encoded in <acronym>ISO</acronym> 8859-1) the
+<quote><literal>?</literal></quote> character (octal <literal>77</literal>)
+matches any single character; the
+<quote><literal>*</literal></quote> character (octal <literal>52</literal>)
+matches any series of zero or more characters; and
+alphabetic characters match either upper- or lowercase. The
+returned <parameter>NAMES</parameter> are encoded in
+<acronym>ISO</acronym> 8859-1 and may contain mixed
+character cases. Font names are not required to be in <acronym>XLFD</acronym>
+format.
+ </para>
+ <para>
+If <parameter>PATTERN</parameter> is of zero length or
+<parameter>MAX-NAMES</parameter> is equal to zero,
+one reply containing a zero-length list of names is returned.
+This may be used to synchronize the client with the server.
+ </para>
+ <para>
+Servers are free to add or remove fonts to the set returned by
+<function>ListFonts</function>
+between any two requests. This request is not
+cumulative; repeated uses are processed in isolation and do
+result in an iteration through the list.
+ </para>
+ <para>
+To reduce the amount of buffering needed by the server, the
+list of names may be split across several reply packets, so
+long as the names arrive in the same order that they would
+have appeared had they been in a single packet. The
+<parameter>REPLIES-FOLLOWING-HINT</parameter> field in all but the last reply
+contains a positive value that specifies the number of
+replies that are likely, but not required, to follow. In the
+last reply, which may contain zero or more names, this field
+is set to zero.
+ </para>
+</section>
+
+<section id="Requests:ListFontsWithXInfo">
+ <title><function>ListFontsWithXInfo</function></title>
+ <indexterm zone="Requests:ListFontsWithXInfo" significance="preferred"><primary>ListFontsWithXInfo</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>max-names</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry>▶+</entry></row>
+ <row><entry><parameter>replies-following-hint</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>info</parameter>:</entry><entry><link linkend="Data_Types:XFONTINFO"><type>XFONTINFO</type></link></entry></row>
+ <row rowsep='1'><entry><parameter>name</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request is similar to
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>
+except that a separate
+reply containing the name, header, and property data is
+generated for each matching font name. Following these
+replies, if any, a final reply containing a zero-length
+<parameter>NAME</parameter> and no <parameter>INFO</parameter> is sent.
+ </para>
+ <para>
+The <parameter>REPLIES-FOLLOWING-HINT</parameter> field in all but the
+last reply contains a positive value that specifies the number of replies
+that are likely, but not required, to follow. In the last
+reply, this field is set to zero.
+ </para>
+ <para>
+If <parameter>PATTERN</parameter> is of zero length or if
+<parameter>MAX-NAMES</parameter> is equal to zero, only the final reply
+containing a zero-length <parameter>NAME</parameter> and no
+<parameter>INFO</parameter> is returned. This may be used to synchronize the
+client with the server.
+ </para>
+</section>
+
+<section id="Requests:OpenBitmapFont">
+ <title><function>OpenBitmapFont</function></title>
+ <indexterm zone="Requests:OpenBitmapFont" significance="preferred"><primary>OpenBitmapFont</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry><parameter>pattern</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>format-mask</parameter>:</entry><entry><link linkend="Data_Types:BITMAPFORMATMASK"><type>BITMAPFORMATMASK</type></link></entry></row>
+ <row><entry><parameter>format-hint</parameter>:</entry><entry><link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row><entry><parameter>otherid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link> or <constant>None</constant></entry></row>
+ <row><entry><parameter>otherid-valid</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row rowsep='1'><entry><parameter>cachable</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry>Errors:</entry><entry>
+<link linkend="Errors:IDChoice"><errorname>IDChoice</errorname></link>,
+<link linkend="Errors:Name"><errorname>Name</errorname></link>,
+<link linkend="Errors:Format"><errorname>Format</errorname></link>,
+<link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request looks for a server-dependent choice of the
+font names that match the specified <parameter>PATTERN</parameter>
+according to the rules described for
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>.
+If no matches are found, a
+<link linkend="Errors:Name"><errorname>Name</errorname></link>
+error is returned. Otherwise, the server attempts to
+open the font associated with the chosen name.
+ </para>
+ <para>
+Permission to access the font is determined by the server
+according the licensing policy used for this font. The server
+may use the client's current
+<type>AccessContext</type>
+(as set by the most
+recent
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+request or the original connection
+setup) to determine any client-specific sets of permissions.
+After the font has been opened, the client is allowed to
+specify a new
+<type>AccessContext</type>
+with
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+or release
+the
+<type>AccessContext</type>
+using
+<link linkend="Requests:FreeAC"><function>FreeAC</function></link>
+. Subsequent
+<link linkend="Requests:QueryXInfo"><function>QueryXInfo</function></link>,
+<link linkend="Requests:QueryXExtents8"><function>QueryXExtents8</function></link>,
+<link linkend="Requests:QueryXExtents16"><function>QueryXExtents16</function></link>,
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>,
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+and
+<link linkend="Requests:CloseFont"><function>CloseFont</function></link>
+requests on this <link linkend="Data_Types:FONTID"><type>FONTID</type></link> are
+performed according to permissions granted at the time of the
+<function>OpenBitmapFont</function>
+request.
+ </para>
+ <para>
+If the server is willing and able to detect that the client
+has already opened the font successfully (possibly under a
+different name), the <parameter>OTHERID</parameter> field
+may be set to one of the
+identifiers previously used to open the font. The
+<parameter>OTHERID-VALID</parameter> field indicates whether or not
+<parameter>OTHERID</parameter> is still associated with an open font:
+if it is <constant>True</constant>, the client may use
+<parameter>OTHERID</parameter> as an alternative to
+<parameter>FONTID</parameter>. Otherwise, if
+<parameter>OTHERID-VALID</parameter> is <constant>False</constant>,
+<parameter>OTHERID</parameter> is no longer
+open but has not been reused by a subsequent
+<function>OpenBitmapFont</function>
+request.
+ </para>
+ <para>
+If <parameter>OTHERID</parameter> is set to <constant>None</constant>,
+then <parameter>OTHERID-VALID</parameter> should be set
+to <constant>False</constant>.
+ </para>
+ <para>
+The <parameter>FORMAT-MASK</parameter> indicates which fields in
+<parameter>FORMAT-HINT</parameter>
+the client is likely to use in subsequent
+<function>GetXBitmaps8</function>
+and
+<function>GetXBitmaps16</function>
+requests. Servers may wish to use
+this information to precompute certain values.
+ </para>
+ <para>
+If <parameter>CACHABLE</parameter> is set to <constant>True</constant>,
+the client may cache the font
+(so that redundant opens of the same font may be avoided)
+and use it with all
+<type>AccessContext</type>s
+during the life of the
+client without violating the font's licensing policy. This
+flag is typically set whenever a font is unlicensed or is
+licensed on a per-display basis. If <parameter>CACHABLE</parameter>
+is <constant>False</constant>, the
+client should reopen the font for each
+<type>AccessContext</type>.
+ </para>
+ <para>
+The server is permitted to add to or remove from the set of
+fonts returned by
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>
+between any two requests, though
+mechanisms outside the protocol. Therefore, it is possible
+for this request (which is atomic) to return a different font
+than would result from separate a
+<link linkend="Requests:ListFonts"><function>ListFonts</function></link>
+followed by an
+<function>OpenBitmapFont</function>
+with a non-wildcarded font name.
+ </para>
+ <para>
+If <parameter>FONTID</parameter> is not in the range
+[1..2<superscript>29</superscript>-1] or if it is already
+associated with an open font, an
+<link linkend="Errors:IDChoice"><errorname>IDChoice</errorname></link>
+error is returned.
+If no font is available that matches the specified
+<parameter>PATTERN</parameter>, a
+<link linkend="Errors:Name"><errorname>Name</errorname></link>
+error is returned. If the font is present but the client
+is not permitted access, an
+<link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>
+error is returned.
+If <parameter>FORMAT-MASK</parameter> has any unspecified bits set or if any
+of the fields in <parameter>FORMAT-HINT</parameter> indicated by
+<parameter>FORMAT-MASK</parameter> are invalid, a
+<link linkend="Errors:Format"><errorname>Format</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:QueryXInfo">
+ <title><function>QueryXInfo</function></title>
+ <indexterm zone="Requests:QueryXInfo" significance="preferred"><primary>QueryXInfo</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>info</parameter>:</entry><entry><link linkend="Data_Types:XFONTINFO"><type>XFONTINFO</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns the font header and property information
+for the open font associated with <parameter>FONTID</parameter>.
+ </para>
+ <para>
+If <parameter>FONTID</parameter> is not associated with any open fonts, a
+<link linkend="Errors:Font"><errorname>Font</errorname></link>
+error
+is returned.
+ </para>
+</section>
+
+<section id="Requests:QueryXExtents8">
+ <title><function>QueryXExtents8</function></title>
+ <indexterm zone="Requests:QueryXExtents8" significance="preferred"><primary>QueryXExtents8</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry><parameter>range</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>chars</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>extents</parameter>:</entry><entry><link linkend="Data_Types:XCHARINFO"><type>LISTofXCHARINFO</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>,
+<link linkend="Errors:Range"><errorname>Range</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request is equivalent to
+<link linkend="Requests:QueryXExtents16"><function>QueryXExtents16</function></link>
+except that it
+uses 1-byte character codes.
+ </para>
+</section>
+
+<section id="Requests:QueryXExtents16">
+ <title><function>QueryXExtents16</function></title>
+ <indexterm zone="Requests:QueryXExtents16" significance="preferred"><primary>QueryXExtents16</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry><parameter>range</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>chars</parameter>:</entry><entry><link linkend="Data_Types:CHAR2B"><type>LISTofCHAR2B</type></link></entry></row>
+ <row><entry>▶</entry></row>
+ <row rowsep='1'><entry><parameter>extents</parameter>:</entry><entry><link linkend="Data_Types:XCHARINFO"><type>LISTofXCHARINFO</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>,
+<link linkend="Errors:Range"><errorname>Range</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns a list of glyph extents from the open
+font associated with FONTID for the series of characters
+specified by <parameter>RANGE</parameter> and <parameter>CHARS</parameter>.
+ </para>
+ <para>
+If <parameter>RANGE</parameter> is <constant>True</constant>,
+each succeeding pair of elements in <parameter>CHARS</parameter> is
+treated as a range of characters for which extents should be
+returned. If <parameter>CHARS</parameter> contains an odd number of elements,
+the font's <structfield>XFONTINFO.CHAR-RANGE.MAX-CHAR</structfield>
+is implicitly appended to
+the list. If <parameter>CHARS</parameter> contains no elements, the list is
+implicitly replaced with the font's
+<structfield>XFONTINFO.CHAR-RANGE.</structfield> If
+any of the resulting character ranges are invalid, a
+<link linkend="Errors:Range"><errorname>Range</errorname></link>
+error is returned. Otherwise, the character ranges are
+concatenated in the order given by <parameter>CHARS</parameter> to produce
+a set of character codes for which extents are returned.
+ </para>
+ <para>
+If <parameter>RANGE</parameter> is <constant>False</constant>,
+then <parameter>CHARS</parameter> specifies the set of character
+codes for which extents are returned. If <parameter>CHARS</parameter> is of
+zero length, then a zero-length list of extents is returned.
+ </para>
+ <para>
+The extents for each character code in the resulting set (which
+may contain duplicates) are returned in the order in
+which the character codes appear in the set.
+At least one metric for each character shall be non-zero
+unless the character is not encoded in the font, in which case
+all-zero metrics are returned.
+A blank, zero-width character can be encoded
+with non-zero but equal left and right bearings.
+ </para>
+ <para>
+If <parameter>FONTID</parameter> is not associated with any open fonts, a
+<link linkend="Errors:Font"><errorname>Font</errorname></link>
+error is
+returned. If <parameter>RANGE</parameter> is <constant>True</constant>
+and <parameter>CHARS</parameter> contains any invalid ranges, a
+<link linkend="Errors:Range"><errorname>Range</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:QueryXBitmaps8">
+ <title><function>QueryXBitmaps8</function></title>
+ <indexterm zone="Requests:QueryXBitmaps8" significance="preferred"><primary>QueryXBitmaps8</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry><parameter>range</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>chars</parameter>:</entry><entry><link linkend="Data_Types:STRING8"><type>STRING8</type></link></entry></row>
+ <row><entry><parameter>format</parameter>:</entry><entry><link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link></entry></row>
+ <row><entry>▶+</entry></row>
+ <row><entry><parameter>replies-following-hint</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>offsets</parameter>:</entry><entry><link linkend="Data_Types:OFFSET32"><type>LISTofOFFSET32</type></link></entry></row>
+ <row><entry><parameter>bitmaps</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ <row rowsep='1'><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>,
+<link linkend="Errors:Range"><errorname>Range</errorname></link>,
+<link linkend="Errors:Format"><errorname>Format</errorname></link>,
+<link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request is equivalent to
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+except that it
+uses 1-byte character codes.
+ </para>
+</section>
+
+<section id="Requests:QueryXBitmaps16">
+ <title><function>QueryXBitmaps16</function></title>
+ <indexterm zone="Requests:QueryXBitmaps16" significance="preferred"><primary>QueryXBitmaps16</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry><parameter>range</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>chars</parameter>:</entry><entry><link linkend="Data_Types:CHAR2B"><type>LISTofCHAR2B</type></link></entry></row>
+ <row><entry><parameter>format</parameter>:</entry><entry><link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link></entry></row>
+ <row><entry>▶+</entry></row>
+ <row><entry><parameter>replies-following-hint</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>offsets</parameter>:</entry><entry><link linkend="Data_Types:OFFSET32"><type>LISTofOFFSET32</type></link></entry></row>
+ <row rowsep='1'><entry><parameter>bitmaps</parameter>:</entry><entry><link linkend="Data_Types:BYTE"><type>LISTofBYTE</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>,
+ <link linkend="Errors:Range"><errorname>Range</errorname></link>,
+ <link linkend="Errors:Format"><errorname>Format</errorname></link>,
+ <link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request returns a list of glyph bitmaps from the open font associated
+with <parameter>FONTID</parameter> for the series of characters
+specified by <parameter>RANGE</parameter> and <parameter>CHARS</parameter>.
+ </para>
+ <para>
+If <parameter>RANGE</parameter> is <constant>True</constant>, each succeeding
+pair of elements in <parameter>CHARS</parameter> is
+treated as a range of characters for which bitmaps should be
+returned. If <parameter>CHARS</parameter> contains an odd number of elements,
+the font's <structfield>XFONTINFO.CHAR-RANGE.MAX-CHAR</structfield>
+is implicitly appended to
+the list. If <parameter>CHARS</parameter> contains no elements, the list is
+implicitly replaced with the font's
+<structfield>XFONTINFO.CHAR-RANGE.</structfield> If
+any of the resulting character ranges are invalid, a <link linkend="Errors:Range"><errorname>Range</errorname></link>
+error is returned. Otherwise, the character ranges are
+concatenated in the order given by <parameter>CHARS</parameter> to produce
+a set of character codes for which bitmaps are returned.
+ </para>
+ <para>
+If <parameter>RANGE</parameter> is <constant>False</constant>,
+then <parameter>CHARS</parameter> specifies the set of character
+codes for which bitmaps are returned. If <parameter>CHARS</parameter>
+is of zero length, then a single reply containing a zero-length list of
+offsets and bitmaps is returned.
+ </para>
+ <para>
+If any of the resulting character ranges are invalid, a
+<link linkend="Errors:Range"><errorname>Range</errorname></link>
+error is returned. Otherwise, the resulting character ranges
+are concatenated in the order given by <parameter>CHARS</parameter>
+to produce a set of character codes for which bitmaps are returned.
+ </para>
+ <para>
+The server is free to return the glyph bitmaps in multiple
+replies to reduce the amount of buffering that is necessary.
+In this situation, the set of characters obtained above is
+partitioned into an implementation-dependent number of
+ordered, non-overlapping subsets containing runs of one or
+more consecutive characters. The global ordering of
+characters must be maintained such that concatenating the
+subsets in order that they were produced yields the original
+set. A reply is generated for each subset, in the order that
+it was produced.
+ </para>
+ <para>
+For each character in a subset, an image of that character's
+glyph is described by a rectangle of bits corresponding to the
+pixels specified by FORMAT.IMAGE-RECT. Within the image, set
+and clear bits represent inked and non-inked pixels,
+respectively.
+ </para>
+ <para>
+Each scanline of a glyph image, from top to bottom, is zero-padded
+on the right to a multiple of the number of bits specified by
+FORMAT.SCANLINE-PAD. The scanline is then divided from left
+to right into a sequence of FORMAT.SCANLINE-UNIT bits. The
+bits of each unit are then arranged such that the left-most
+pixel is stored in the most- or least-significant bit,
+according to FORMAT.BIT-ORDER-MSB. The bytes of each unit are
+then arranged such that the most- or least-significant byte,
+according to FORMAT.BYTE-ORDER-MSB, is transmitted first.
+Finally, the units are arranged such that the left-most is
+transmitted first and the right-most is transmitted last.
+ </para>
+ <para>
+The individual images within a subset are then concatenated in
+a server-dependent order to form the <parameter>BITMAPS</parameter> data
+of the reply. If a glyph image is duplicated within a reply, the
+server is free to return fewer (but at least one) copies of
+the image. If a character is not encoded within the font, a
+zero-length bitmap is substituted for this character. Each
+glyph image must begin at a bit position that is a multiple of
+the FORMAT.SCANLINE-UNIT.
+ </para>
+ <para>
+The <parameter>OFFSETS</parameter> array in a reply contains one entry
+for each character in the subset being returned, in the order that the
+characters appear in the subset. Each entry specifies the
+starting location in bytes and size in bytes of the
+corresponding glyph image in the <parameter>BITMAPS</parameter> data of that
+reply (i.e. an offset may not refer to data in another reply).
+ </para>
+ <para>
+The <parameter>REPLIES-FOLLOWING-HINT</parameter> field in all but the
+last reply contains a positive value that specifies the number of replies
+that are likely, but not required, to follow. In the last
+reply, which may contain data for zero or more characters,
+this field is set to zero.
+ </para>
+ <para>
+If <parameter>FONTID</parameter> is not associated with any open fonts,
+a <link linkend="Errors:Font"><errorname>Font</errorname></link>
+error is returned. If <parameter>RANGE</parameter> is
+<constant>True</constant> and <parameter>CHARS</parameter> contains any
+invalid ranges, a
+<link linkend="Errors:Range"><errorname>Range</errorname></link> error
+is returned. If <parameter>FORMAT</parameter> is invalid, a
+<link linkend="Errors:Format"><errorname>Format</errorname></link> error
+is returned.
+ </para>
+</section>
+
+<section id="Requests:CloseFont">
+ <title><function>CloseFont</function></title>
+ <indexterm zone="Requests:CloseFont" significance="preferred"><primary>CloseFont</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row rowsep='1'><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry></row>
+ <row><entry>Errors:</entry><entry><link linkend="Errors:Font"><errorname>Font</errorname></link>, <link linkend="Errors:Alloc"><errorname>Alloc</errorname></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This request indicates that the specified <parameter>FONTID</parameter>
+should no longer be associated with an open font. The server is free to
+release any client-specific storage or licenses allocated for
+the font. The client may reuse the value of <parameter>FONTID</parameter>
+in a subsequent
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+request.
+ </para>
+ <para>
+If <parameter>FONTID</parameter> is not associated with any open fonts, a
+<link linkend="Errors:Font"><errorname>Font</errorname></link>
+error is returned.
+ </para>
+</section>
+
+<section id="Requests:close_connection">
+ <title>close connection</title>
+ <indexterm zone="Requests:close_connection" significance="preferred"><primary>close connection</primary></indexterm>
+
+ <para>
+When a connection is closed, a
+<link linkend="Requests:CloseFont"><function>CloseFont</function></link>
+is done on all fonts
+that are open on the connection. In addition, the server is
+free to release any storage or licenses allocated on behalf of
+the client that made the connection.
+ </para>
+</section>
+</section>
+
+<section id='Errors'>
+<title>Errors</title>
+<!-- .XS -->
+<!-- (SN Errors -->
+<!-- .XE -->
+<para>
+All errors are at least 16 bytes long and contain the following fields:
+</para>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>type</parameter>:</entry><entry><type>CARD8</type></entry><entry>value of 1</entry></row>
+ <row><entry><parameter>error-code</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>sequence-number</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>length</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>timestamp</parameter>:</entry><entry><link linkend="Data_Types:TIMESTAMP"><type>TIMESTAMP</type></link></entry></row>
+ <row><entry><parameter>major-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>minor-opcode</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+<para>
+The TYPE field has a value of one. The ERROR-CODE field specifies which error
+occurred. Core errors codes are in the range 0 through 127, extension error
+codes are in the range 128 through 255. The SEQUENCE-NUMBER field contains the
+least significant 16 bits of the sequence number of the request that caused the
+error. The LENGTH field specifies the length of the error packet in 4-byte
+units and must have a value of at least 4. The TIMESTAMP specifies the server
+time when the error occurred. The MAJOR-OPCODE and MINOR-OPCODE (zero for core
+requests) fields specify the type of request that generated the error. The
+DATA-OR-UNUSED field may be used for 16 bits of error-specific information. If
+LENGTH is greater than four, these fields are followed by (LENGTH - 4) * 4
+bytes of extra data.
+</para>
+<para>
+The following errors are defined for the core protocol:
+</para>
+
+<section id="Errors:Request">
+ <title><errorname>Request</errorname></title>
+ <indexterm zone="Errors:Request" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Request</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by any request that has an unknown
+combination of major and minor request numbers, or by any
+extension request that is issued before a
+<link linkend="Requests:QueryExtension"><function>QueryExtension</function></link>
+of that extension.
+ </para>
+</section>
+
+<section id="Errors:Format">
+ <title><errorname>Format</errorname></title>
+ <indexterm zone="Errors:Format" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Format</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>format</parameter>:</entry><entry><link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link></entry><entry>bad format value</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by the use of an invalid <link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link>
+in the
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>,
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>, and
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+requests.
+The value that caused the error is included as extra data.
+ </para>
+</section>
+
+<section id="Errors:Font">
+ <title><errorname>Font</errorname></title>
+ <indexterm zone="Errors:Font" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Font</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>fontid</parameter>:</entry><entry><link linkend="Data_Types:FONTID"><type>FONTID</type></link></entry><entry>bad font identifier</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by an invalid <link linkend="Data_Types:FONTID"><type>FONTID</type></link> in the
+<link linkend="Requests:QueryXInfo"><function>QueryXInfo</function></link>,
+<link linkend="Requests:QueryXExtents8"><function>QueryXExtents8</function></link>,
+<link linkend="Requests:QueryXExtents16"><function>QueryXExtents16</function></link>,
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>,
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+and
+<link linkend="Requests:CloseFont"><function>CloseFont</function></link>
+requests. The value that caused
+the error is included as extra data.
+ </para>
+</section>
+
+<section id="Errors:Range">
+ <title><errorname>Range</errorname></title>
+ <indexterm zone="Errors:Range" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Range</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>range</parameter>:</entry><entry><link linkend="Data_Types:RANGE"><type>RANGE</type></link></entry><entry>bad range</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by an invalid <link linkend="Data_Types:RANGE"><type>RANGE</type></link> in the
+<link linkend="Requests:QueryXExtents8"><function>QueryXExtents8</function></link>,
+<link linkend="Requests:QueryXExtents16"><function>QueryXExtents16</function></link>,
+<link linkend="Requests:QueryXBitmaps8"><function>QueryXBitmaps8</function></link>
+and
+<link linkend="Requests:QueryXBitmaps16"><function>QueryXBitmaps16</function></link>
+requests. The
+value that caused the error is included as extra data.
+ </para>
+</section>
+
+<section id="Errors:EventMask">
+ <title><errorname>EventMask</errorname></title>
+ <indexterm zone="Errors:EventMask" significance="preferred"><primary>Error Codes</primary><secondary><errorname>EventMask</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>event-mask</parameter>:</entry><entry><link linkend="Data_Types:EVENTMASK"><type>EVENTMASK</type></link></entry><entry>bad event mask</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by an invalid <link linkend="Data_Types:EVENTMASK"><type>EVENTMASK</type></link> in the
+<link linkend="Requests:SetEventMask"><function>SetEventMask</function></link>
+request. The value that caused the error is
+included as extra data.
+ </para>
+</section>
+
+<section id="Errors:AccessContext">
+ <title><errorname>AccessContext</errorname></title>
+ <indexterm zone="Errors:AccessContext" significance="preferred"><primary>Error Codes</primary><secondary><errorname>AccessContext</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>ac</parameter>:</entry><entry><link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link></entry><entry>unaccepted <type>AccessContext</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by an invalid <link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link> in the
+<link linkend="Requests:FreeAC"><function>FreeAC</function></link>
+or
+<link linkend="Requests:SetAuthorization"><function>SetAuthorization</function></link>
+request or by an
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+request performed without sufficient authorization. In the
+first two cases, the <link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link> of the errant request is
+returned as extra data. In the third case, the current
+<link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link> is returned as extra data.
+ </para>
+</section>
+
+<section id="Errors:IDChoice">
+ <title><errorname>IDChoice</errorname></title>
+ <indexterm zone="Errors:IDChoice" significance="preferred"><primary>Error Codes</primary><secondary><errorname>IDChoice</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>id</parameter>:</entry><entry><link linkend="Data_Types:ID"><type>ID</type></link></entry><entry>bad identifier</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by an invalid or already associated
+<link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link> identifier in a
+<link linkend="Requests:CreateAC"><function>CreateAC</function></link>
+request or <link linkend="Data_Types:FONTID"><type>FONTID</type></link> identifier
+in an
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+request. The value that caused the error
+is included as extra data.
+ </para>
+</section>
+
+<section id="Errors:Name">
+ <title><errorname>Name</errorname></title>
+ <indexterm zone="Errors:Name" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Name</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by a font name pattern that matches
+no fonts in an
+<link linkend="Requests:OpenBitmapFont"><function>OpenBitmapFont</function></link>
+request or no catalogue names in a
+<link linkend="Requests:SetCatalogues"><function>SetCatalogues</function></link>
+request.
+ </para>
+</section>
+
+<section id="Errors:Resolution">
+ <title><errorname>Resolution</errorname></title>
+ <indexterm zone="Errors:Resolution" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Resolution</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>X value of errant resolution</entry></row>
+ <row><entry><parameter>y-resolution</parameter>:</entry><entry><type>CARD16</type></entry><entry>Y value of errant resolution</entry></row>
+ <row><entry><parameter>point-size</parameter>:</entry><entry><type>CARD16</type></entry><entry>point size of errant resolution</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated in response to an invalid <link linkend="Data_Types:RESOLUTION"><type>RESOLUTION</type></link>
+structure in a
+<link linkend="Requests:SetResolution"><function>SetResolution</function></link>
+request. The value that caused the
+error is included in the DATA-OR-UNUSED field and as extra data.
+ </para>
+</section>
+
+<section id="Errors:Alloc">
+ <title><errorname>Alloc</errorname></title>
+ <indexterm zone="Errors:Length" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Alloc</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by any request for which the server
+lacks sufficient resources (especially memory).
+ </para>
+</section>
+
+<section id="Errors:Length">
+ <title><errorname>Length</errorname></title>
+ <indexterm zone="Errors:Length" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Length</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ <row><entry><parameter>length</parameter>:</entry><entry><type>CARD32</type></entry><entry>bad length value</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error is generated by any request that has a length field
+greater than (MAXIMUM-REQUEST-LENGTH * 4) bytes. The value that
+caused the error is included as extra data.
+ </para>
+</section>
+
+<section id="Errors:Implementation">
+ <title><errorname>Implementation</errorname></title>
+ <indexterm zone="Errors:Implementation" significance="preferred"><primary>Error Codes</primary><secondary><errorname>Implementation</errorname></secondary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>data-or-unused</parameter>:</entry><entry><type>CARD16</type></entry><entry>unused</entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This error may be generated in response to any request that
+the server is unable to process because it is deficient. Use
+of this error is highly discouraged and indicates lack of
+conformance to the protocol.
+ </para>
+</section>
+<section id="Errors:Extensions">
+ <title>Extensions</title>
+ <para>
+Additional errors may be defined by extensions.
+ </para>
+</section>
+</section>
+
+<section id='Events'>
+<title>Events</title>
+<!-- .XS -->
+<!-- (SN Events -->
+<!-- .XE -->
+<para>
+Events may be generated in response to requests or at the server's discretion
+after the initial connection setup information has been exchanged. Each event
+is at least 12 bytes long and contains the following fields:
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <colspec colname='c3' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>type</parameter>:</entry><entry><type>CARD8</type></entry><entry>value of 2</entry></row>
+ <row><entry><parameter>event-code</parameter>:</entry><entry><type>CARD8</type></entry></row>
+ <row><entry><parameter>sequence-number</parameter>:</entry><entry><type>CARD16</type></entry></row>
+ <row><entry><parameter>length</parameter>:</entry><entry><type>CARD32</type></entry></row>
+ <row><entry><parameter>timestamp</parameter>:</entry><entry><link linkend="Data_Types:TIMESTAMP"><type>TIMESTAMP</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+</para>
+<para>
+The TYPE field contains the value 2. The EVENT-CODE field specifies the number
+of the event and is in the range 0-127 for core events or the range 128-255 for
+extensions. The SEQUENCE-NUMBER field specifies the least significant 16 bits
+of the sequence number of the last request to have been processed by the
+server. The LENGTH field specifies the number of 4-byte units in this event
+packet and must always have a value of at least 3. The <link linkend="Data_Types:TIMESTAMP"><type>TIMESTAMP</type></link> field
+specifies the server time when the event occurred. If LENGTH is greater than
+three, these fields are followed by (LENGTH - 3) * 4 bytes of additional data.
+</para>
+<para>
+Events are described using the following syntax:
+ <blockquote><para>
+ <emphasis role="bold"><function>EventName</function></emphasis>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>arg1</parameter>:</entry><entry><type>type1</type></entry></row>
+ <row><entry> ...</entry></row>
+ <row><entry><parameter>argN</parameter>:</entry><entry><type>typeN</type></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ Description
+ </para></blockquote>
+</para>
+<para>
+If an event does not provide any extra arguments, the
+<parameter>arg1</parameter>...<parameter>argN</parameter>
+lines are omitted from the description.
+</para>
+<para>
+The core X Font Service protocol defines the following events:
+</para>
+
+<section id="Events:KeepAlive">
+ <title><function>KeepAlive</function></title>
+ <indexterm zone="Events:KeepAlive" significance="preferred"><primary>KeepAlive</primary></indexterm>
+ <para>
+This unsolicited, nonmaskable event may be sent by the
+server to verify that the connection has not been broken
+(for transports that do not provide this information).
+Clients should acknowledge receipt of this request
+by sending any request (such as
+<link linkend="Requests:NoOp"><function>NoOp</function></link>
+).
+ </para>
+</section>
+
+<section id="Events:CatalogueListNotify">
+ <title><function>CatalogueListNotify</function></title>
+ <indexterm zone="Events:CatalogueListNotify" significance="preferred"><primary>CatalogueListNotify</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>added</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>deleted</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This event is sent to clients that have included
+<function><constant>CatalogueListChangeMask</constant></function>
+in their core event mask
+whenever the list of catalogues that are available has
+changed. The ADDED field is <constant>True</constant> if new catalogues have
+been added to the server, otherwise it is <constant>False</constant>. The
+DELETED field is <constant>True</constant> if any existing catalogues have
+been removed from the server, otherwise it is <constant>False</constant>.
+ </para>
+</section>
+
+<section id="Events:FontListNotify">
+ <title><function>FontListNotify</function></title>
+ <indexterm zone="Events:FontListNotify" significance="preferred"><primary>FontListNotify</primary></indexterm>
+ <informaltable frame='none'>
+ <?dbfo keep-together="always" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colname='c1' colwidth='1.0*'/>
+ <colspec colname='c2' colwidth='1.0*'/>
+ <tbody>
+ <row><entry><parameter>added</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ <row><entry><parameter>deleted</parameter>:</entry><entry><link linkend="Data_Types:BOOL"><type>BOOL</type></link></entry></row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para>
+This event is sent to clients that have included
+<function><constant>FontListChangeMask</constant></function>
+in their event mask whenever the
+list of fonts that are provided by the currently selected
+catalogues has changed. The ADDED field is <constant>True</constant> if new
+fonts have been added to any of the catalogues currently
+used by the client, otherwise it is <constant>False</constant>. The DELETED
+field is <constant>True</constant> if any existing fonts have been removed
+from any of catalogues used by the client, otherwise it
+is <constant>False</constant>.
+ </para>
+</section>
+<section id="Events:Extensions">
+ <title>Extensions</title>
+ <para>
+Additional events may be defined by extensions.
+ </para>
+</section>
+</section>
+</chapter>
+
+<chapter id='Protocol_Encoding'>
+<title>Protocol Encoding</title>
+<!-- .XS -->
+<!-- (SN Protocol Encoding -->
+<!-- .XE -->
+<para>
+Numbers that are prefixed with <quote><literal>#x</literal></quote>
+are in hexadecimal (base 16). All other
+numbers are in decimal. Requests, replies, errors, events, and compound types
+are described using the syntax:
+</para>
+<!-- .RS -->
+<literallayout class="monospaced">
+
+ Name
+ <emphasis remap='I'>count</emphasis> <emphasis remap='I'>contents</emphasis> <emphasis remap='I'>name</emphasis>
+ ...
+ <emphasis remap='I'>count</emphasis> <emphasis remap='I'>contents</emphasis> <emphasis remap='I'>name</emphasis>
+</literallayout>
+
+<!-- .RE -->
+<para>
+where COUNT is the number of bytes in the data stream occupied by this
+field, CONTENTS is the name of the type as given in
+<link linkend='Data_Types'>Section 4</link> or the value if
+this field contains a constant, and NAME is a description of this field.
+</para>
+<para>
+Objects containing counted lists use a lowercase single-letter variable (whose
+scope is limited to the request, reply, event, or error in which it is found)
+to represent the number of objects in the list. These variables, and any
+expressions in which they are used, should be treated as unsigned integers.
+Multiple copies of an object are indicated by CONTENTS prefix
+<quote>LISTof</quote>.
+</para>
+<para>
+Unused bytes (whose value is undefined) will have a blank CONTENTS field and a
+NAME field of <quote>unused</quote>. Zeroed bytes (whose value must be zero)
+will have a blank CONTENTS field and a NAME field of <quote>zero</quote>.
+The expression pad(e) refers to the number of bytes
+needed to round a value <quote>e</quote> up to the closed
+multiple of four:
+</para>
+<!-- .RS -->
+<literallayout class="monospaced">
+
+ pad(e) = (4 - (e mod 4)) mod 4
+</literallayout>
+
+<section id='Encoding::Data_Types'>
+<title>Data Types</title>
+<!-- .XS -->
+<!-- (SN Data Types -->
+<!-- .XE -->
+<literallayout class="monospaced">
+<link linkend="Data_Types:ACCESSCONTEXT"><type>ACCESSCONTEXT</type></link>
+4 <type>CARD32</type> access context
+
+ with at least one of the following bits set:
+
+ #x1fffffff
+
+ but none of the following bits set:
+
+ #xe0000000 zero
+
+
+<link linkend="Data_Types:ALTERNATESERVER"><type>ALTERNATESERVER</type></link>
+1 <type>BOOL</type> subset
+1 n length of name
+n <type>STRING8</type> name
+p unused, p=pad(n+2)
+
+<link linkend="Data_Types:AUTH"><type>AUTH</type></link>
+2 n length of name
+2 d length of data
+n <type>STRING8</type> name
+p unused, p=pad(n)
+d <type>STRING8</type> data
+q unused, q=pad(d)
+
+
+<link linkend="Data_Types:BITMAPFORMAT"><type>BITMAPFORMAT</type></link>
+4 <type>CARD32</type> value, union of the following bits:
+
+ #x00000001 ByteOrderMSB
+ #x00000002 BitOrderMSB
+ #x00000000 <constant>ImageRectMin</constant>
+ #x00000004 <constant>ImageRectMaxWidth</constant>
+ #x00000008 <constant>ImageRectMax</constant>
+ #x00000000 <constant>ScanlinePad8</constant>
+ #x00000100 <constant>ScanlinePad16</constant>
+ #x00000200 <constant>ScanlinePad32</constant>
+ #x00000300 <constant>ScanlinePad64</constant>
+ #x00000000 <constant>ScanlineUnit8</constant>
+ #x00001000 <constant>ScanlineUnit16</constant>
+ #x00002000 <constant>ScanlineUnit32</constant>
+ #x00003000 <constant>ScanlineUnit64</constant>
+
+ except for the following bits which must be zero:
+
+ #xffffccf0 zero
+
+ and the following of which at most one bit may be set:
+
+ #x0000000c at most one bit can be set
+
+
+<link linkend="Data_Types:BITMAPFORMATMASK"><type>BITMAPFORMATMASK</type></link>
+4 <type>CARD32</type> value, mask of the following bits:
+
+ #x00000001 <constant>ByteOrderMask</constant>
+ #x00000002 <constant>BitOrderMask</constant>
+ #x00000004 <constant>ImageRectMask</constant>
+ #x00000008 <constant>ScanlinePadMask</constant>
+ #x00000010 <constant>ScanlineUnitMask</constant>
+
+ except for the following bits which must be zero:
+
+ #xffffffe0 zero
+
+<link linkend="Data_Types:BOOL"><type>BOOL</type></link>
+1 <type>BOOL</type> boolean, one of the following values:
+ 0 <constant>False</constant>
+ 1 <constant>True</constant>
+
+<link linkend="Data_Types:BYTE"><type>BYTE</type></link>
+1 <type>BYTE</type> unsigned byte of data
+
+<type>CARD8</type>
+1 <type>CARD8</type> 8-bit unsigned integer
+
+<type>CARD16</type>
+2 <type>CARD16</type> 16-bit unsigned integer
+
+<type>CARD32</type>
+4 <type>CARD32</type> 32-bit unsigned integer
+
+<link linkend="Data_Types:CHAR2B"><type>CHAR2B</type></link>
+1 <type>CARD8</type> byte1
+1 <type>CARD8</type> byte2
+
+<link linkend="Data_Types:EVENTMASK"><type>EVENTMASK</type></link>
+4 <type>CARD32</type> event mask
+
+ for core events, this is union of the following bits:
+
+ #00000001 <constant>CatalogueListChangeMask</constant>
+ #00000002 <constant>FontListChangeMask</constant>
+
+ but none of the following bits set:
+
+ #fffffffc
+
+ extensions define their own sets of bits
+
+<link linkend="Data_Types:FONTID"><type>FONTID</type></link>
+4 <type>CARD32</type> font identifier
+
+ with at least one of the following bits set:
+
+ #x1fffffff
+
+ but none of the following bits set:
+
+ #xe0000000 zero
+
+<type>INT8</type>
+1 <type>INT8</type> 8-bit signed integer
+
+<type>INT16</type>
+2 <type>INT16</type> 16-bit signed integer
+
+<type>INT32</type>
+4 <type>INT32</type> 32-bit signed integer
+
+<link linkend="Data_Types:OFFSET32"><type>OFFSET32</type></link>
+4 <type>CARD32</type> position (or integer value)
+4 <type>CARD32</type> length
+
+<link linkend="Data_Types:PROPINFO"><type>PROPINFO</type></link>
+4 n number of <type>PROPOFFSET</type> components
+4 m number of bytes of property data
+20*n <type>PROPOFFSET</type> property offsets into data block
+m <type>LISTofBYTE</type> property data block
+
+<link linkend="Data_Types:PROPOFFSET"><type>PROPOFFSET</type></link>
+8 <type>OFFSET32</type> name in data block
+8 <type>OFFSET32</type> value in data block
+1 <type>CARD8</type> type, one of the following values:
+ 0 <constant>String</constant>
+ 1 <constant>Unsigned</constant>
+ 2 <constant>Signed</constant>
+ 3 zero
+
+<link linkend="Data_Types:RANGE"><type>RANGE</type></link>
+2 <type>CHAR2B</type> minimum character code
+2 <type>CHAR2B</type> maximum character code
+
+<link linkend="Data_Types:RESOLUTION"><type>RESOLUTION</type></link>
+2 <type>CARD16</type> x resolution in pixels per inch
+2 <type>CARD16</type> y resolution in pixels per inch
+2 <type>CARD16</type> point size in decipoints
+
+STRNAME
+1 n length of name
+n <type>STRING8</type> name
+
+<link linkend="Data_Types:STRING8"><type>STRING8</type></link>
+n <type>LISTofBYTE</type> array of 8-bit character values
+
+<link linkend="Data_Types:TIMESTAMP"><type>TIMESTAMP</type></link>
+4 <type>CARD32</type> milliseconds since server time origin
+
+<link linkend="Data_Types:XCHARINFO"><type>XCHARINFO</type></link>
+2 <type>INT16</type> left bearing
+2 <type>INT16</type> right bearing
+2 <type>INT16</type> width
+2 <type>INT16</type> ascent
+2 <type>INT16</type> descent
+2 <type>CARD16</type> attributes
+
+<link linkend="Data_Types:XFONTINFO"><type>XFONTINFO</type></link>
+4 <type>CARD32</type> flags, union of the following bits:
+
+ #x00000001 <constant>AllCharactersExist</constant>
+ #x00000002 <constant>InkInside</constant>
+ #x00000004 <constant>HorizontalOverlap</constant>
+
+ but none of the following bits set:
+
+ #xfffffff8 zero
+
+4 <type>RANGE</type> range of characters in font
+1 <type>CARD8</type> drawing direction
+ 0 <constant>LeftToRight</constant>
+ 1 <constant>RightToLeft</constant>
+1 unused
+2 <type>CHAR2B</type> default character
+12 <type>XCHARINFO</type> minimum bounds
+12 <type>XCHARINFO</type> maximum bounds
+2 <type>INT16</type> font ascent
+2 <type>INT16</type> font descent
+n <type>PROPINFO</type> property data
+</literallayout>
+</section>
+
+<section id='Encoding::Requests'>
+<title>Requests</title>
+<para><link linkend="Requests:open_connection"><emphasis role="bold">open connection</emphasis></link></para>
+<literallayout class="monospaced">
+1 <type>BYTE</type> byteorder, one of the values:
+ #x42 MostSignificant Byte first
+ #x6c LeastSignificant Byte first
+1 <type>CARD8</type> numberof auth in auth-data
+2 2 client-major-protocol-version
+2 0 client-minor-protocol-version
+2 a/4 lengthof auth-data
+a <type>LISTofAUTH</type> auth-data
+▶
+2 <type>CARD16</type> status
+ 0 <constant>Success</constant>
+ 1 <constant>Continue</constant>
+ 2 <constant>Busy</constant>
+ 3 <constant>Denied</constant>
+2 2 major version
+2 0 version
+1 <type>CARD8</type> numberof alternate-servers-hint
+1 <type>CARD8</type> authorization-index
+2 a/4 lengthof alternate-servers-hint
+2 (d+q)/4 lengthof authorization-data
+a <type>LISTofALTERNATESERVER</type> alternate-servers-hint
+d <type>LISTofBYTE</type> authorization-data
+q unused, q=pad(d)
+</literallayout>
+
+<para>
+If STATUS is <constant>Busy</constant> or <constant>Denied</constant>, the protocol stops and the connection is
+closed. If STATUS is <constant>Continue</constant>, the client is expected to respond with
+additional data, to which the server responds with
+a new status value and more data. This dialog continues until the status
+is set to <constant>Success</constant>, or until the server sets STATUS to <constant>Busy</constant> or <constant>Denied</constant>
+and closes the connection:
+</para>
+
+<literallayout class="monospaced">
+◀
+4 1+(d+q)/4 length
+d <type>LISTofBYTE</type> more-authorization-data
+q unused, q=pad(d)
+▶
+4 2+(d+q)/4 length
+2 <type>CARD16</type> status
+ 0 <constant>Success</constant>
+ 1 <constant>Continue</constant>
+ 2 <constant>Busy</constant>
+ 3 <constant>Denied</constant>
+2 unused
+d <type>LISTofBYTE</type> more-authorization-data
+q unused, q=pad(d)
+</literallayout>
+<para>
+When STATUS is <constant>Success</constant>, the protocol resumes with the following
+sent by the server:
+</para>
+
+<literallayout class="monospaced">
+4 3+(v+w)/4 length of rest of data
+2 <type>CARD16</type> maximum-request-length
+2 v length of vendor string
+4 <type>CARD32</type> release-number
+v <type>STRING8</type> vendor-string
+w unused, w=pad(v)
+</literallayout>
+<para>
+Once the connection has been established, the client may send the
+following requests:
+</para>
+
+<literallayout class="monospaced">
+<link linkend="Requests:NoOp"><emphasis role="bold"><function>NoOp</function></emphasis></link>
+1 0 major-opcode
+1 unused
+2 1 length
+
+<link linkend="Requests:ListExtensions"><emphasis role="bold"><function>ListExtensions</function></emphasis></link>
+1 1 major-opcode
+1 unused
+2 1 length
+▶
+1 0 type reply
+1 <type>CARD8</type> numberof names
+2 <type>CARD16</type> sequence-number
+4 2+(n+p)/4 length
+n LISTofSTRNAME names
+p unused, p=pad(n)
+
+<link linkend="Requests:QueryExtension"><emphasis role="bold"><function>QueryExtension</function></emphasis></link>
+1 2 major-opcode
+1 n length of name
+2 1+(n+p)/4 length
+n <type>STRING8</type> name
+p unused, p=pad(n)
+▶
+1 0 type reply
+1 <type>BOOL</type> present
+2 <type>CARD16</type> sequence-number
+4 5 length
+2 <type>CARD16</type> major-version
+2 <type>CARD16</type> minor-version
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> first-event
+1 <type>CARD8</type> number-events
+1 <type>CARD8</type> first-error
+1 <type>CARD8</type> number-errors
+3 unused
+
+<link linkend="Requests:ListCatalogues"><emphasis role="bold"><function>ListCatalogues</function></emphasis></link>
+1 3 major-opcode
+1 unused
+2 3+(n+p)/4 length
+4 <type>CARD32</type> max-names
+2 n length of pattern
+2 unused
+n <type>STRING8</type> pattern
+p unused, p=pad(n)
+▶+
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 4+(n+p)/4 length
+4 <type>CARD32</type> replies-following-hint
+4 <type>CARD32</type> numberof catalogue-names
+n LISTofSTRNAME catalogue-names
+p unused, p=pad(n)
+
+<link linkend="Requests:SetCatalogues"><emphasis role="bold"><function>SetCatalogues</function></emphasis></link>
+1 4 major-opcode
+1 <type>CARD8</type> numberof catalogue-names
+2 1+(n+p)/4 length
+n LISTofSTRNAME catalogue-names
+p unused, p=pad(n)
+
+<link linkend="Requests:GetCatalogues"><emphasis role="bold"><function>GetCatalogues</function></emphasis></link>
+1 5 major-opcode
+1 unused
+2 1 length
+▶
+1 0 type reply
+1 <type>CARD8</type> numberof catalogue-names
+2 <type>CARD16</type> sequence-number
+4 2+(n+p)/4 length
+n LISTofSTRNAME catalogue-names
+p unused, p=pad(n)
+
+<link linkend="Requests:SetEventMask"><emphasis role="bold"><function>SetEventMask</function></emphasis></link>
+1 6 major-opcode
+1 <type>CARD8</type> extension-opcode
+2 2 length
+4 <type>EVENTMASK</type> event-mask
+
+<link linkend="Requests:GetEventMask"><emphasis role="bold"><function>GetEventMask</function></emphasis></link>
+1 7 major-opcode
+1 <type>CARD8</type> extension-opcode
+2 1 length
+▶
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 3 length
+4 <type>EVENTMASK</type> event-mask
+
+<link linkend="Requests:CreateAC"><emphasis role="bold"><function>CreateAC</function></emphasis></link>
+1 8 major-opcode
+1 <type>CARD8</type> numberof authorization-protocols
+2 2+a/4 length
+4 <type>ACCESSCONTEXT</type> ac
+a <type>LISTofAUTH</type> authorization-protocols
+▶
+1 0 type reply
+1 <type>CARD8</type> authorization-index
+2 <type>CARD16</type> sequence-number
+4 3+(d+q)/4 length
+2 <type>CARD16</type> status
+ 0 <constant>Success</constant>
+ 1 <constant>Continue</constant>
+ 2 <constant>Busy</constant>
+ 3 <constant>Denied</constant>
+2 unused
+d <type>LISTofBYTE</type> authorization-data
+q unused, q=pad(d)
+</literallayout>
+
+<para>
+If STATUS is <constant>Continue</constant>, the client is expected to respond with additional
+data, to which the server
+responds with a new status value and more data. This dialog continues
+until the status is set to
+<constant>Success</constant>, <constant>Busy</constant>, or <constant>Denied</constant> at which point the request is finished.
+</para>
+
+<literallayout class="monospaced">
+◀
+4 1+(d+q)/4 length
+d <type>LISTofBYTE</type> more-authorization-data
+q unused, q=pad(d)
+▶
+4 2+(d+q)/4 length
+2 <type>CARD16</type> status
+ 0 <constant>Success</constant>
+ 1 <constant>Continue</constant>
+ 2 <constant>Busy</constant>
+ 3 <constant>Denied</constant>
+2 unused
+d <type>LISTofBYTE</type> authorization-data
+q unused, q=pad(d)
+
+<link linkend="Requests:FreeAC"><emphasis role="bold"><function>FreeAC</function></emphasis></link>
+1 9 major-opcode
+1 unused
+2 2 length
+4 <type>ACCESSCONTEXT</type> ac
+
+<link linkend="Requests:SetAuthorization"><emphasis role="bold"><function>SetAuthorization</function></emphasis></link>
+1 10 major-opcode
+1 unused
+2 2 length
+4 <type>ACCESSCONTEXT</type> ac
+
+<link linkend="Requests:SetResolution"><emphasis role="bold"><function>SetResolution</function></emphasis></link>
+1 11 major-opcode
+1 n number of resolutions
+2 1+(6*n+p)/4 length
+6*n <type>LISTofRESOLUTION</type> resolutions
+p p=pad(6*n)
+
+<link linkend="Requests:GetResolution"><emphasis role="bold"><function>GetResolution</function></emphasis></link>
+1 12 major-opcode
+1 unused
+2 1 length
+▶
+1 0 type reply
+1 n number of resolutions
+2 <type>CARD16</type> sequence-number
+4 2+(6*n+p)/4 length
+6*n <type>LISTofRESOLUTION</type> resolutions
+p p=pad(6*n)
+
+<link linkend="Requests:ListFonts"><emphasis role="bold"><function>ListFonts</function></emphasis></link>
+1 13 major-opcode
+1 unused
+2 3+(n+p)/4 length
+4 <type>CARD32</type> max-names
+2 n length of pattern
+2 unused
+n <type>STRING8</type> pattern
+p unused, p=pad(n)
+▶+
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 4+(n+p)/4 length
+4 <type>CARD32</type> replies-following-hint
+4 <type>CARD32</type> numberof font-names
+n LISTofSTRNAME font-names
+p unused, p=pad(n)
+
+<link linkend="Requests:ListFontsWithXInfo"><emphasis role="bold"><function>ListFontsWithXInfo</function></emphasis></link>
+1 14 major-opcode
+1 unused
+2 3+(n+p)/4 length
+4 <type>CARD32</type> max-names
+2 n length of pattern
+2 unused
+n <type>STRING8</type> pattern
+p unused, p=pad(n)
+▶+ (except for last in series)
+1 0 type reply
+1 n length of name
+2 <type>CARD16</type> sequence-number
+4 3+(n+p+f)/4 length
+4 <type>CARD32</type> replies-hint
+f <type>XFONTINFO</type> fontinfo
+n <type>STRING8</type> name
+p unused, p=pad(n)
+▶ (last in series)
+1 0 type reply
+1 0 last-reply indicator
+2 <type>CARD16</type> sequence-number
+4 2 reply length
+
+<link linkend="Requests:OpenBitmapFont"><emphasis role="bold"><function>OpenBitmapFont</function></emphasis></link>
+1 15 major-opcode
+1 unused
+2 4+(n+p)/4 length
+4 <type>FONTID</type> fontid
+4 <type>BITMAPFORMATMASK</type> format-mask
+4 <type>BITMAPFORMAT</type> format
+n STRNAME pattern
+p unused, p=pad(n)
+▶
+1 0 type reply
+1 <type>BOOL</type> otherid-valid
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>FONTID</type> otherid
+1 <type>BOOL</type> cachable
+3 unused
+
+<link linkend="Requests:QueryXInfo"><emphasis role="bold"><function>QueryXInfo</function></emphasis></link>
+1 16 major-opcode
+1 unused
+2 2 length
+4 <type>FONTID</type> fontid
+▶
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 2+f/4 length
+f <type>XFONTINFO</type> fontinfo
+p unused, p=pad(f)
+
+<link linkend="Requests:QueryXExtents8"><emphasis role="bold"><function>QueryXExtents8</function></emphasis></link>
+1 17 major-opcode
+1 <type>BOOL</type> range
+2 3+(n+p)/4 length
+4 <type>FONTID</type> fontid
+4 n number chars entries
+n <type>STRING8</type> chars
+p unused, p=pad(n)
+▶
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 3+3*n length
+4 n number of extents
+12*n <type>LISTofXCHARINFO</type> extents
+
+<link linkend="Requests:QueryXExtents16"><emphasis role="bold"><function>QueryXExtents16</function></emphasis></link>
+1 18 major-opcode
+1 <type>BOOL</type> range
+2 3+(2*n+p)/4 length
+4 <type>FONTID</type> fontid
+4 n number chars entries
+2*n <type>LISTofCHAR2B</type> chars
+p unused, p=pad(2*n)
+▶
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 3+3*n length
+4 n number of extents
+12*n <type>LISTofXCHARINFO</type> extents
+
+<link linkend="Requests:QueryXBitmaps8"><emphasis role="bold"><function>QueryXBitmaps8</function></emphasis></link>
+1 19 major-opcode
+1 <type>BOOL</type> range
+2 4+(n+p)/4 length
+4 <type>FONTID</type> fontid
+4 <type>BITMAPFORMAT</type> format
+4 n number of chars entries
+n <type>STRING8</type> chars
+p unused, p=pad(n)
+▶+
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 5+2*n+(m+p)/4 length
+4 <type>CARD32</type> replies-following-hint
+4 n number of offsets
+4 m number of bytes of glyph images
+8*n <type>LISTofOFFSET32</type> offsets
+m <type>LISTofBYTE</type> glyphimages
+p unused, p=pad(m)
+
+<link linkend="Requests:QueryXBitmaps16"><emphasis role="bold"><function>QueryXBitmaps16</function></emphasis></link>
+1 20 major-opcode
+1 <type>BOOL</type> range
+2 4+(2*n+p)/4 length
+4 <type>FONTID</type> fontid
+4 <type>BITMAPFORMAT</type> format
+4 n number of chars entries
+2*n <type>LISTofCHAR2B</type> chars
+p unused, p=pad(2*n)
+▶
+1 0 type reply
+1 unused
+2 <type>CARD16</type> sequence-number
+4 5+2*n+(m+p)/4 length
+4 <type>CARD32</type> replies-following-hint
+4 n number of offsets
+4 m number of bytes of glyph images
+8*n <type>LISTofOFFSET32</type> offsets
+m <type>LISTofBYTE</type> glyphimages
+p unused, p=pad(m)
+
+<link linkend="Requests:CloseFont"><emphasis role="bold"><function>CloseFont</function></emphasis></link>
+1 21 major-opcode
+1 unused
+2 2 length
+4 <type>FONTID</type> fontid
+</literallayout>
+</section>
+
+<section id='Encoding::Errors'>
+<title>Errors</title>
+<literallayout class="monospaced">
+
+<link linkend="Errors:Request"><emphasis role="bold"><errorname>Request</errorname></emphasis></link>
+1 1 type error
+1 0 <errorname>Request</errorname>
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+
+<link linkend="Errors:Format"><emphasis role="bold"><errorname>Format</errorname></emphasis></link>
+1 1 type error
+1 1 <errorname>Format</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>BITMAPFORMAT</type> bad-format
+
+<link linkend="Errors:Font"><emphasis role="bold"><errorname>Font</errorname></emphasis></link>
+1 1 type error
+1 2 <errorname>Font</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>FONTID</type> bad-fontid
+
+<link linkend="Errors:Range"><emphasis role="bold"><errorname>Range</errorname></emphasis></link>
+1 1 type error
+1 3 <errorname>Range</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>RANGE</type> bad-range
+
+<link linkend="Errors:EventMask"><emphasis role="bold"><errorname>EventMask</errorname></emphasis></link>
+1 1 type error
+1 4 <errorname>EventMask</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>EVENTMASK</type> event-mask
+
+<link linkend="Errors:AccessContext"><emphasis role="bold"><errorname>AccessContext</errorname></emphasis></link>
+1 1 type error
+1 5 <errorname>AccessContext</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>ACCESSCONTEXT</type> access context
+
+<link linkend="Errors:IDChoice"><emphasis role="bold"><errorname>IDChoice</errorname></emphasis></link>
+1 1 type error
+1 6 <errorname>IDChoice</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>FONTID</type> bad-fontid
+
+<link linkend="Errors:Name"><emphasis role="bold"><errorname>Name</errorname></emphasis></link>
+1 1 type error
+1 7 <errorname>Name</errorname>
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+
+<link linkend="Errors:Resolution"><emphasis role="bold"><errorname>Resolution</errorname></emphasis></link>
+1 1 type error
+1 8 <errorname>Resolution</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+6 <type>RESOLUTION</type> resolution
+
+<link linkend="Errors:Alloc"><emphasis role="bold"><errorname>Alloc</errorname></emphasis></link>
+1 1 type error
+1 9 <errorname>Alloc</errorname>
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+
+<link linkend="Errors:Length"><emphasis role="bold"><errorname>Length</errorname></emphasis></link>
+1 1 type error
+1 10 <errorname>Length</errorname>
+2 <type>CARD16</type> sequence-number
+4 5 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+4 <type>CARD32</type> bad-length
+
+<link linkend="Errors:Implementation"><emphasis role="bold"><errorname>Implementation</errorname></emphasis></link>
+1 1 type error
+1 11 <errorname>Implementation</errorname>
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>CARD8</type> major-opcode
+1 <type>CARD8</type> minor-opcode
+2 unused
+
+</literallayout>
+</section>
+
+<section id='Encoding::Events'>
+<title>Events</title>
+<literallayout class="monospaced">
+<link linkend="Events:KeepAlive"><emphasis role="bold"><function>KeepAlive</function></emphasis></link>
+1 2 type event
+1 0 event KeepAlive
+2 <type>CARD16</type> sequence-number
+4 3 length
+4 <type>TIMESTAMP</type> timestamp
+
+<link linkend="Events:CatalogueListNotify"><emphasis role="bold"><function>CatalogueListNotify</function></emphasis></link>
+1 2 type event
+1 1 event CatalogueListNotify
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>BOOL</type> added
+1 <type>BOOL</type> deleted
+2 unused
+
+<link linkend="Events:FontListNotify"><emphasis role="bold"><function>FontListNotify</function></emphasis></link>
+1 2 type event
+1 2 event FontListNotify
+2 <type>CARD16</type> sequence-number
+4 4 length
+4 <type>TIMESTAMP</type> timestamp
+1 <type>BOOL</type> added
+1 <type>BOOL</type> deleted
+2 unused
+
+</literallayout>
+</section>
+</chapter>
+
+<chapter id='Acknowledgements'>
+<title>Acknowledgements</title>
+<!-- .XS -->
+<!-- (SN Acknowledgements -->
+<!-- .XE -->
+<para>
+This document represents the culmination of several years of debate and
+experiments done under the auspices of the
+<orgname class="consortium">MIT X Consortium</orgname> font working group.
+Although this was a group effort, the author remains responsible for any errors
+or omissions. The protocol presented here was primarily designed by
+<personname><firstname>Jim</firstname><surname>Fulton</surname></personname>,
+<personname><firstname>Keith</firstname><surname>Packard</surname></personname>,
+and
+<personname><firstname>Bob</firstname><surname>Scheifler</surname></personname>.
+Special thanks goes to
+<personname><firstname>Ned</firstname><surname>Batchelder</surname></personname>,
+<personname><firstname>Jim</firstname><surname>Flowers</surname></personname>,
+and
+<personname><firstname>Axel</firstname><surname>Deininger</surname></personname>
+for their invigorating comments
+which never failed to make this a better document.
+<personname><firstname>Stephen</firstname><surname>Gildea</surname></personname>
+edited version 2 of this document. Finally,
+<personname><firstname>David</firstname><surname>Lemke</surname></personname>
+deserves great credit for designing and coding the sample implementation.
+</para>
+</chapter>
+
+<bibliography id='References'>
+<title>References</title>
+<para>
+All of the following documents are X Consortium standards available from
+the X Consortium.
+</para>
+<biblioentry id='References:x11proto'>
+ <abbrev>1</abbrev>
+ <title><olink targetdoc='x11protocol' targetptr='x11protocol'>X Window System Protocol Version 11</olink></title>
+ <author><firstname>Robert W.</firstname><surname>Scheifler</surname></author>
+</biblioentry>
+
+<biblioentry id='References:bdf-spec'>
+ <abbrev>2</abbrev>
+ <corpauthor>Adobe Systems</corpauthor>
+ <title>Bitmap Distribution Format 2.1</title>
+</biblioentry>
+
+<biblioentry id='References:xlfd-spec'>
+ <abbrev>3</abbrev>
+ <corpauthor>X Consortium</corpauthor>
+ <title><olink targetdoc='xlfd' targetptr='xlfd'>X Logical Font
+ Description Conventions, Version 1.5</olink></title>
+</biblioentry>
+
+</bibliography>
+
+<appendix id="suggested_licensing_policies">
+<title>Suggested Licensing Policies</title>
+<para>
+The authorization data passed by the client in the initial connection
+setup information may be used by the font server to implement restrictions
+on which fonts may be accessed. Furthermore, the font server is free to
+refuse new connections at any time.
+</para>
+<para>
+Configuration or management of the license restrictions is outside the scope of
+the font service protocol and is done in a server-dependent manner. Possible
+policies might include, but are not limited to, combinations of the following:
+
+<variablelist>
+ <?dbhtml list-presentation="list"?>
+ <varlistentry>
+ <term>No restrictions</term>
+ <listitem>
+ <para>
+anyone may access any fonts. The server neither refuses any connections
+nor generates <link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link> errors on any
+fonts. For environments without specially-licensed fonts, this is
+sufficient.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Per-machine</term>
+ <listitem>
+ <para>
+only those clients connecting from a known set of
+machines are permitted access. The server could get the address
+of the connection and look in a list of allowed machines.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Per-user</term>
+ <listitem>
+ <para>
+only a known set of users may access the fonts. The
+server can use the authorization data (such as a Kerberos ticket
+or a Secure RPC credential) to verify the identity of the user
+and then look in a list of allowed users.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Simultaneous Use</term>
+ <listitem>
+ <para>
+only a certain number of clients may use a given font at any one time.
+Additional clients would receive <link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link>
+errors if they attempt to open the font. This is only effective if
+the initial clients keep the font open for the entire time that it
+is being used (even if all of the data has been transmitted and is
+being cached).
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Postage Meter</term>
+ <listitem>
+ <para>
+a particular font may only be accessed a limited
+number of times before its license must be renewed. Each time
+the font is opened, the server decrements a counter. When the
+counter reaches zero, all further attempts to open the font
+return an <link linkend="Errors:AccessContext"><errorname>AccessContext</errorname></link> error.
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<para>
+It should be noted that chaining of font servers (obtaining font data from
+other font servers) may conflict with certain license policies.
+</para>
+</appendix>
+
+<appendix id="implementation_suggestions">
+<title>Implementation Suggestions</title>
+<para>
+Font server implementations will probably wish to use techniques such as the
+following to avoid limits on the number of simultaneous connections:
+</para>
+<itemizedlist>
+ <listitem>
+ <para>
+The initial connection information returned by the font
+server contains the names of other font servers that
+may be used as substitutes. A font server may refuse to
+accept a connection, indicating that the client should
+try one of the alternatives instead.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+On operating systems that support processing forking, font
+servers might choose to fork so that the child can continue
+processing the existing connections and the parent can accept
+new connections. Such implementations are encouraged to use
+shared memory so that in-memory font databases can be shared.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+On operating systems that support passing stream file descriptors
+between processes, cooperating font servers could collect
+connections in a single process when there are few connections
+and spread them among several processes as the load increases.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If a font client is unable to connect to a server (as opposed
+to having the connection terminated), it should retry for an
+implementation-dependent length of time (see Xlib's
+handling of ECONNREFUSED in XConnDis.c).
+ </para>
+ </listitem>
+</itemizedlist>
+</appendix>
+<index id="index" />
+</book>