aboutsummaryrefslogtreecommitdiff
path: root/libX11/specs/libX11/CH08
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/specs/libX11/CH08')
-rw-r--r--libX11/specs/libX11/CH083468
1 files changed, 3468 insertions, 0 deletions
diff --git a/libX11/specs/libX11/CH08 b/libX11/specs/libX11/CH08
new file mode 100644
index 000000000..3d2161fb2
--- /dev/null
+++ b/libX11/specs/libX11/CH08
@@ -0,0 +1,3468 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), 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:
+.\"
+.\" 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 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.
+.\"
+.\" 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.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" Permission to use, copy, modify and distribute this documentation for
+.\" any purpose and without fee is hereby granted, provided that the above
+.\" copyright notice appears in all copies and that both that copyright notice
+.\" and this permission notice appear in all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+\&
+.sp 1
+.ce 3
+\s+1\fBChapter 8\fP\s-1
+
+\s+1\fBGraphics Functions\fP\s-1
+.sp 2
+.nr H1 8
+.nr H2 0
+.nr H3 0
+.nr H4 0
+.nr H5 0
+.na
+.LP
+.XS
+Chapter 8: Graphics Functions
+.XE
+Once you have established a connection to a display,
+you can use the Xlib graphics functions to:
+.IP \(bu 5
+Clear and copy areas
+.IP \(bu 5
+Draw points, lines, rectangles, and arcs
+.IP \(bu 5
+Fill areas
+.IP \(bu 5
+Manipulate fonts
+.IP \(bu 5
+Draw text
+.IP \(bu 5
+Transfer images between clients and the server
+.LP
+If the same drawable and GC is used for each call,
+Xlib batches back-to-back calls to
+.PN XDrawPoint ,
+.PN XDrawLine ,
+.PN XDrawRectangle ,
+.PN XFillArc ,
+and
+.PN XFillRectangle .
+Note that this reduces the total number of requests sent to the server.
+.NH 2
+Clearing Areas
+.XS
+\*(SN Clearing Areas
+.XE
+.LP
+Xlib provides functions that you can use to clear an area or the entire window.
+Because pixmaps do not have defined backgrounds,
+they cannot be filled by using the functions described in this section.
+Instead, to accomplish an analogous operation on a pixmap,
+you should use
+.PN XFillRectangle ,
+which sets the pixmap to a known value.
+.LP
+.sp
+To clear a rectangular area of a given window, use
+.PN XClearArea .
+.IN "Areas" "clearing"
+.IN "Clearing" "areas"
+.IN "XClearArea" "" "@DEF@"
+.sM
+.FD 0
+XClearArea\^(\^\fIdisplay\fP, \fIw\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIexposures\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ Bool \fIexposures\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.ds Xy , which are relative to the origin of the window \
+and specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh , which are the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIexposures\fP 1i
+Specifies a Boolean value that indicates if
+.PN Expose
+events are to be generated.
+.LP
+.eM
+The
+.PN XClearArea
+function paints a rectangular area in the specified window according to the
+specified dimensions with the window's background pixel or pixmap.
+The subwindow-mode effectively is
+.PN ClipByChildren .
+If width is zero, it
+is replaced with the current width of the window minus x.
+If height is
+zero, it is replaced with the current height of the window minus y.
+If the window has a defined background tile,
+the rectangle clipped by any children is filled with this tile.
+If the window has
+background
+.PN None ,
+the contents of the window are not changed.
+In either
+case, if exposures is
+.PN True ,
+one or more
+.PN Expose
+events are generated for regions of the rectangle that are either visible or are
+being retained in a backing store.
+If you specify a window whose class is
+.PN InputOnly ,
+a
+.PN BadMatch
+error results.
+.LP
+.PN XClearArea
+can generate
+.PN BadMatch ,
+.PN BadValue ,
+and
+.PN BadWindow
+errors.
+.LP
+.sp
+To clear the entire area in a given window, use
+.PN XClearWindow .
+.IN "Window" "clearing"
+.IN "Clearing" "windows"
+.IN "XClearWindow" "" "@DEF@"
+.sM
+.FD 0
+XClearWindow\^(\^\fIdisplay\fP, \fIw\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.LP
+.eM
+The
+.PN XClearWindow
+function clears the entire area in the specified window and is
+equivalent to
+.PN XClearArea
+(display, w, 0, 0, 0, 0,
+.PN False ).
+If the window has a defined background tile, the rectangle is tiled with a
+plane-mask of all ones and
+.PN GXcopy
+function.
+If the window has
+background
+.PN None ,
+the contents of the window are not changed.
+If you specify a window whose class is
+.PN InputOnly ,
+a
+.PN BadMatch
+error results.
+.LP
+.PN XClearWindow
+can generate
+.PN BadMatch
+and
+.PN BadWindow
+errors.
+.NH 2
+Copying Areas
+.XS
+\*(SN Copying Areas
+.XE
+.LP
+Xlib provides functions that you can use to copy an area or a bit plane.
+.LP
+.sp
+To copy an area between drawables of the same
+root and depth, use
+.PN XCopyArea .
+.IN "Areas" "copying"
+.IN "Copying" "areas"
+.IN "XCopyArea" "" "@DEF@"
+.sM
+.FD 0
+XCopyArea\^(\^\fIdisplay\fP, \fIsrc\fP\^, \fIdest\fP\^, \fIgc\fP\^, \fIsrc_x\fP\^, \fIsrc_y\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIdest_x\fP\^, \fIdest_y\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fIsrc\fP\^, \fIdest\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIsrc_x\fP\^, \fIsrc_y\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ int \fIdest_x\fP\^, \fIdest_y\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIsrc\fP 1i
+.br
+.ns
+.IP \fIdest\fP 1i
+Specify the source and destination rectangles to be combined.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIsrc_x\fP 1i
+.br
+.ns
+.IP \fIsrc_y\fP 1i
+Specify the x and y coordinates,
+which are relative to the origin of the source rectangle
+and specify its upper-left corner.
+.ds Wh , which are the dimensions of both the source \
+and destination rectangles
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Dx , which are relative to the origin of the destination rectangle \
+and specify its upper-left corner
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx.
+.LP
+.eM
+The
+.PN XCopyArea
+function combines the specified rectangle of src with the specified rectangle
+of dest.
+The drawables must have the same root and depth,
+or a
+.PN BadMatch
+error results.
+.LP
+If regions of the source rectangle are obscured and have not been
+retained in backing store
+or if regions outside the boundaries of the source drawable are specified,
+those regions are not copied.
+Instead, the
+following occurs on all corresponding destination regions that are either
+visible or are retained in backing store.
+If the destination is a window with a background other than
+.PN None ,
+corresponding regions
+of the destination are tiled with that background
+(with plane-mask of all ones and
+.PN GXcopy
+function).
+Regardless of tiling or whether the destination is a window or a pixmap,
+if graphics-exposures is
+.PN True ,
+then
+.PN GraphicsExpose
+events for all corresponding destination regions are generated.
+If graphics-exposures is
+.PN True
+but no
+.PN GraphicsExpose
+events are generated, a
+.PN NoExpose
+event is generated.
+Note that by default graphics-exposures is
+.PN True
+in new GCs.
+.LP
+This function uses these GC components: function, plane-mask,
+subwindow-mode, graphics-exposures, clip-x-origin,
+clip-y-origin, and clip-mask.
+.LP
+.PN XCopyArea
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.sp
+.LP
+To copy a single bit plane of a given drawable, use
+.PN XCopyPlane .
+.IN "Plane" "copying"
+.IN "Copying" "planes"
+.IN "XCopyPlane" "" "@DEF@"
+.sM
+.FD 0
+XCopyPlane\^(\^\fIdisplay\fP, \fIsrc\fP\^, \fIdest\fP\^, \fIgc\fP\^, \fIsrc_x\fP\^, \fIsrc_y\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIdest_x\fP\^, \fIdest_y\fP\^, \fIplane\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fIsrc\fP\^, \fIdest\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIsrc_x\fP\^, \fIsrc_y\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ int \fIdest_x\fP\^, \fIdest_y\fP\^;
+.br
+ unsigned long \fIplane\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIsrc\fP 1i
+.br
+.ns
+.IP \fIdest\fP 1i
+Specify the source and destination rectangles to be combined.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIsrc_x\fP 1i
+.br
+.ns
+.IP \fIsrc_y\fP 1i
+Specify the x and y coordinates,
+which are relative to the origin of the source rectangle
+and specify its upper-left corner.
+.ds Wh , which are the dimensions of both the source and destination rectangles
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Dx , which are relative to the origin of the destination rectangle \
+and specify its upper-left corner
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx.
+.IP \fIplane\fP 1i
+Specifies the bit plane.
+You must set exactly one bit to 1.
+.LP
+.eM
+The
+.PN XCopyPlane
+function uses a single bit plane of the specified source rectangle
+combined with the specified GC to modify the specified rectangle of dest.
+The drawables must have the same root but need not have the same depth.
+If the drawables do not have the same root, a
+.PN BadMatch
+error results.
+If plane does not have exactly one bit set to 1 and the value of plane
+is not less than %2 sup n%, where \fIn\fP is the depth of src, a
+.PN BadValue
+error results.
+.LP
+Effectively,
+.PN XCopyPlane
+forms a pixmap of the same depth as the rectangle of dest and with a
+size specified by the source region.
+It uses the foreground/background pixels in the GC (foreground
+everywhere the bit plane in src contains a bit set to 1,
+background everywhere the bit plane in src contains a bit set to 0)
+and the equivalent of a
+.PN CopyArea
+protocol request is performed with all the same exposure semantics.
+This can also be thought of as using the specified region of the source
+bit plane as a stipple with a fill-style of
+.PN FillOpaqueStippled
+for filling a rectangular area of the destination.
+.LP
+This function uses these GC components: function, plane-mask, foreground,
+background, subwindow-mode, graphics-exposures, clip-x-origin, clip-y-origin,
+and clip-mask.
+.LP
+.PN XCopyPlane
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.NH 2
+Drawing Points, Lines, Rectangles, and Arcs
+.XS
+\*(SN Drawing Points, Lines, Rectangles, and Arcs
+.XE
+.LP
+Xlib provides functions that you can use to draw:
+.IP \(bu 5
+A single point or multiple points
+.IP \(bu 5
+A single line or multiple lines
+.IP \(bu 5
+A single rectangle or multiple rectangles
+.IP \(bu 5
+A single arc or multiple arcs
+.LP
+Some of the functions described in the following sections
+use these structures:
+.LP
+.IN "XSegment" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+ short x1, y1, x2, y2;
+} XSegment;
+.De
+.LP
+.eM
+.IN "XPoint" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+ short x, y;
+} XPoint;
+.De
+.LP
+.eM
+.IN "XRectangle" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+ short x, y;
+ unsigned short width, height;
+} XRectangle;
+.De
+.LP
+.eM
+.IN "XArc" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ short x, y;
+ unsigned short width, height;
+ short angle1, angle2; /* Degrees * 64 */
+} XArc;
+.De
+.LP
+.eM
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+.NH 3
+Drawing Single and Multiple Points
+.XS
+\*(SN Drawing Single and Multiple Points
+.XE
+.LP
+.IN "Points" "drawing"
+.IN "Drawing" "points"
+.IN "XDrawPoints"
+.IN "XDrawPoint"
+.LP
+To draw a single point in a given drawable, use
+.PN XDrawPoint .
+.IN "XDrawPoint" "" "@DEF@"
+.sM
+.FD 0
+XDrawPoint\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates where you want the point drawn.
+.LP
+.eM
+.sp
+To draw multiple points in a given drawable, use
+.PN XDrawPoints .
+.IN "XDrawPoints" "" "@DEF@"
+.sM
+.FD 0
+XDrawPoints\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIpoints\fP\^, \fInpoints\fP\^, \fImode\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XPoint *\fIpoints\fP\^;
+.br
+ int \fInpoints\fP\^;
+.br
+ int \fImode\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fImode\fP 1i
+Specifies the coordinate mode.
+You can pass
+.PN CoordModeOrigin
+or
+.PN CoordModePrevious .
+.LP
+.eM
+The
+.PN XDrawPoint
+function uses the foreground pixel and function components of the
+GC to draw a single point into the specified drawable;
+.PN XDrawPoints
+draws multiple points this way.
+.PN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.PN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.PN XDrawPoints
+draws the points in the order listed in the array.
+.LP
+Both functions use these GC components: function, plane-mask,
+foreground, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+.LP
+.PN XDrawPoint
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.PN XDrawPoints
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.NH 3
+Drawing Single and Multiple Lines
+.XS
+\*(SN Drawing Single and Multiple Lines
+.XE
+.LP
+.IN "Lines" "drawing"
+.IN "Drawing" "lines"
+.IN "XDrawLine"
+.IN "XDrawLines"
+.IN "Polygons" "drawing"
+.IN "Drawing" "polygons"
+.IN "XDrawSegments"
+.LP
+To draw a single line between two points in a given drawable, use
+.PN XDrawLine .
+.IN "XDrawLine" "" "@DEF@"
+.sM
+.FD 0
+XDrawLine\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx1\fP\^, \fIy1\fP\^, \fIx2\fP\^, \fIy2\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx1\fP\^, \fIy1\fP\^, \fIx2\fP\^, \fIy2\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIx1\fP 1i
+.br
+.ns
+.IP \fIy1\fP 1i
+.br
+.ns
+.IP \fIx2\fP 1i
+.br
+.ns
+.IP \fIy2\fP 1i
+Specify the points (x1, y1) and (x2, y2) to be connected.
+.LP
+.eM
+.sp
+To draw multiple lines in a given drawable, use
+.PN XDrawLines .
+.IN "XDrawLines" "" "@DEF@"
+.sM
+.FD 0
+XDrawLines\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIpoints\fP\^, \fInpoints\fP\^, \fImode\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XPoint *\fIpoints\fP\^;
+.br
+ int \fInpoints\fP\^;
+.br
+ int \fImode\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fImode\fP 1i
+Specifies the coordinate mode.
+You can pass
+.PN CoordModeOrigin
+or
+.PN CoordModePrevious .
+.LP
+.eM
+.sp
+To draw multiple, unconnected lines in a given drawable,
+use
+.PN XDrawSegments .
+.IN "XDrawSegments" "" "@DEF@"
+.sM
+.FD 0
+XDrawSegments\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIsegments\fP\^, \fInsegments\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XSegment *\fIsegments\fP\^;
+.br
+ int \fInsegments\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIsegments\fP 1i
+Specifies an array of segments.
+.IP \fInsegments\fP 1i
+Specifies the number of segments in the array.
+.LP
+.eM
+The
+.PN XDrawLine
+function uses the components of the specified GC to
+draw a line between the specified set of points (x1, y1) and (x2, y2).
+It does not perform joining at coincident endpoints.
+For any given line,
+.PN XDrawLine
+does not draw a pixel more than once.
+If lines intersect, the intersecting pixels are drawn multiple times.
+.LP
+The
+.PN XDrawLines
+function uses the components of the specified GC to draw
+npoints\-1 lines between each pair of points (point[i], point[i+1])
+in the array of
+.PN XPoint
+structures.
+It draws the lines in the order listed in the array.
+The lines join correctly at all intermediate points, and if the first and last
+points coincide, the first and last lines also join correctly.
+For any given line,
+.PN XDrawLines
+does not draw a pixel more than once.
+If thin (zero line-width) lines intersect,
+the intersecting pixels are drawn multiple times.
+If wide lines intersect, the intersecting pixels are drawn only once, as though
+the entire
+.PN PolyLine
+protocol request were a single, filled shape.
+.PN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.PN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.LP
+The
+.PN XDrawSegments
+function draws multiple, unconnected lines.
+For each segment,
+.PN XDrawSegments
+draws a
+line between (x1, y1) and (x2, y2).
+It draws the lines in the order listed in the array of
+.PN XSegment
+structures and does not perform joining at coincident endpoints.
+For any given line,
+.PN XDrawSegments
+does not draw a pixel more than once.
+If lines intersect, the intersecting pixels are drawn multiple times.
+.LP
+All three functions use these GC components:
+function, plane-mask, line-width,
+line-style, cap-style, fill-style, subwindow-mode,
+clip-x-origin, clip-y-origin, and clip-mask.
+The
+.PN XDrawLines
+function also uses the join-style GC component.
+All three functions also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.PN XDrawLine ,
+.PN XDrawLines ,
+and
+.PN XDrawSegments
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.PN XDrawLines
+also can generate
+.PN BadValue
+errors.
+.NH 3
+Drawing Single and Multiple Rectangles
+.XS
+\*(SN Drawing Single and Multiple Rectangles
+.XE
+.LP
+.IN "Rectangles" "drawing"
+.IN "Drawing" "rectangles"
+.IN "XDrawRectangle"
+.IN "XDrawRectangles"
+.LP
+To draw the outline of a single rectangle in a given drawable, use
+.PN XDrawRectangle .
+.IN "XDrawRectangle" "" "@DEF@"
+.sM
+.FD 0
+XDrawRectangle\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh , which specify the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.LP
+.eM
+.sp
+To draw the outline of multiple rectangles
+in a given drawable, use
+.PN XDrawRectangles .
+.IN "XDrawRectangles" "" "@DEF@"
+.sM
+.FD 0
+XDrawRectangles\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIrectangles\fP\^, \fInrectangles\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XRectangle \fIrectangles\fP\^[\^]\^;
+.br
+ int \fInrectangles\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIrectangles\fP 1i
+Specifies an array of rectangles.
+.IP \fInrectangles\fP 1i
+Specifies the number of rectangles in the array.
+.LP
+.eM
+The
+.PN XDrawRectangle
+and
+.PN XDrawRectangles
+functions draw the outlines of the specified rectangle or rectangles as
+if a five-point
+.PN PolyLine
+protocol request were specified for each rectangle:
+.IP
+[x,y] [x+width,y] [x+width,y+height] [x,y+height] [x,y]
+.LP
+For the specified rectangle or rectangles,
+these functions do not draw a pixel more than once.
+.PN XDrawRectangles
+draws the rectangles in the order listed in the array.
+If rectangles intersect,
+the intersecting pixels are drawn multiple times.
+.LP
+Both functions use these GC components:
+function, plane-mask, line-width,
+line-style, cap-style, join-style, fill-style,
+subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.PN XDrawRectangle
+and
+.PN XDrawRectangles
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 3
+Drawing Single and Multiple Arcs
+.XS
+\*(SN Drawing Single and Multiple Arcs
+.XE
+.LP
+.IN "Drawing" "arcs"
+.IN "XDrawArc"
+.IN "Arcs" "drawing"
+.IN "XDrawArcs"
+.LP
+.sp
+To draw a single arc in a given drawable, use
+.PN XDrawArc .
+.IN "XDrawArc" "" "@DEF@"
+.sM
+.FD 0
+XDrawArc\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIangle1\fP\^, \fIangle2\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ int \fIangle1\fP\^, \fIangle2\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the drawable \
+and specify the upper-left corner of the bounding rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh , which are the major and minor axes of the arc
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIangle1\fP 1i
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+.IP \fIangle2\fP 1i
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+.LP
+.eM
+.sp
+To draw multiple arcs in a given drawable, use
+.PN XDrawArcs .
+.IN "XDrawArcs" "" "@DEF@"
+.sM
+.FD 0
+XDrawArcs\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIarcs\fP\^, \fInarcs\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XArc *\fIarcs\fP\^;
+.br
+ int \fInarcs\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIarcs\fP 1i
+Specifies an array of arcs.
+.IP \fInarcs\fP 1i
+Specifies the number of arcs in the array.
+.LP
+.eM
+.EQ
+delim %%
+.EN
+.PN XDrawArc
+draws a single circular or elliptical arc, and
+.PN XDrawArcs
+draws multiple circular or elliptical arcs.
+Each arc is specified by a rectangle and two angles.
+The center of the circle or ellipse is the center of the
+rectangle, and the major and minor axes are specified by the width and height.
+Positive angles indicate counterclockwise motion,
+and negative angles indicate clockwise motion.
+If the magnitude of angle2 is greater than 360 degrees,
+.PN XDrawArc
+or
+.PN XDrawArcs
+truncates it to 360 degrees.
+.LP
+For an arc specified as %[ ~x, ~y, ~width , ~height, ~angle1, ~angle2 ]%,
+the origin of the major and minor axes is at
+% [ x +^ {width over 2} , ~y +^ {height over 2} ]%,
+and the infinitely thin path describing the entire circle or ellipse
+intersects the horizontal axis at % [ x, ~y +^ {height over 2} ]% and
+% [ x +^ width , ~y +^ { height over 2 }] %
+and intersects the vertical axis at % [ x +^ { width over 2 } , ~y ]% and
+% [ x +^ { width over 2 }, ~y +^ height ]%.
+These coordinates can be fractional
+and so are not truncated to discrete coordinates.
+The path should be defined by the ideal mathematical path.
+For a wide line with line-width lw,
+the bounding outlines for filling are given
+by the two infinitely thin paths consisting of all points whose perpendicular
+distance from the path of the circle/ellipse is equal to lw/2
+(which may be a fractional value).
+The cap-style and join-style are applied the same as for a line
+corresponding to the tangent of the circle/ellipse at the endpoint.
+.LP
+For an arc specified as % [ ~x, ~y, ~width, ~height, ~angle1, ~angle2 ]%,
+the angles must be specified
+in the effectively skewed coordinate system of the ellipse (for a
+circle, the angles and coordinate systems are identical). The
+relationship between these angles and angles expressed in the normal
+coordinate system of the screen (as measured with a protractor) is as
+follows:
+.LP
+.Ds
+% roman "skewed-angle" ~ = ~ atan left ( tan ( roman "normal-angle" )
+ * width over height right ) +^ adjust%
+.De
+.LP
+The skewed-angle and normal-angle are expressed in radians (rather
+than in degrees scaled by 64) in the range % [ 0 , ~2 pi ]% and where atan
+returns a value in the range % [ - pi over 2 , ~pi over 2 ] %
+and adjust is:
+.LP
+.Ds
+.TA 1i 2i
+.ta 1i 2i
+%0% for normal-angle in the range % [ 0 , ~pi over 2 ]%
+%pi% for normal-angle in the range % [ pi over 2 , ~{3 pi} over 2 ]%
+%2 pi% for normal-angle in the range % [ {3 pi} over 2 , ~2 pi ]%
+.De
+.LP
+For any given arc,
+.PN XDrawArc
+and
+.PN XDrawArcs
+do not draw a pixel more than once.
+If two arcs join correctly and if the line-width is greater than zero
+and the arcs intersect,
+.PN XDrawArc
+and
+.PN XDrawArcs
+do not draw a pixel more than once.
+Otherwise,
+the intersecting pixels of intersecting arcs are drawn multiple times.
+Specifying an arc with one endpoint and a clockwise extent draws the same pixels
+as specifying the other endpoint and an equivalent counterclockwise extent,
+except as it affects joins.
+.LP
+If the last point in one arc coincides with the first point in the following
+arc, the two arcs will join correctly.
+If the first point in the first arc coincides with the last point in the last
+arc, the two arcs will join correctly.
+By specifying one axis to be zero, a horizontal or vertical line can be
+drawn.
+Angles are computed based solely on the coordinate system and ignore the
+aspect ratio.
+.LP
+Both functions use these GC components:
+function, plane-mask, line-width, line-style, cap-style, join-style,
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.PN XDrawArc
+and
+.PN XDrawArcs
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 2
+Filling Areas
+.XS
+\*(SN Filling Areas
+.XE
+.LP
+Xlib provides functions that you can use to fill:
+.IP \(bu 5
+A single rectangle or multiple rectangles
+.IP \(bu 5
+A single polygon
+.IP \(bu 5
+A single arc or multiple arcs
+.NH 3
+Filling Single and Multiple Rectangles
+.XS
+\*(SN Filling Single and Multiple Rectangles
+.XE
+.LP
+.IN "Filling" "rectangles"
+.IN "XFillRectangle"
+.IN "Rectangle" "filling"
+.IN "XFillRectangles"
+.LP
+.sp
+To fill a single rectangular area in a given drawable, use
+.PN XFillRectangle .
+.IN "XFillRectangle" "" "@DEF@"
+.sM
+.FD 0
+XFillRectangle\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the drawable \
+and specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh , which are the dimensions of the rectangle to be filled
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.LP
+.eM
+.sp
+To fill multiple rectangular areas in a given drawable, use
+.PN XFillRectangles .
+.IN "XFillRectangles" "" "@DEF@"
+.sM
+.FD 0
+XFillRectangles\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIrectangles\fP\^, \fInrectangles\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XRectangle *\fIrectangles\fP\^;
+.br
+ int \fInrectangles\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIrectangles\fP 1i
+Specifies an array of rectangles.
+.IP \fInrectangles\fP 1i
+Specifies the number of rectangles in the array.
+.LP
+.eM
+The
+.PN XFillRectangle
+and
+.PN XFillRectangles
+functions fill the specified rectangle or rectangles
+as if a four-point
+.PN FillPolygon
+protocol request were specified for each rectangle:
+.LP
+.Ds
+[x,y] [x+width,y] [x+width,y+height] [x,y+height]
+.De
+.LP
+Each function uses the x and y coordinates,
+width and height dimensions, and GC you specify.
+.LP
+.PN XFillRectangles
+fills the rectangles in the order listed in the array.
+For any given rectangle,
+.PN XFillRectangle
+and
+.PN XFillRectangles
+do not draw a pixel more than once.
+If rectangles intersect, the intersecting pixels are
+drawn multiple times.
+.LP
+Both functions use these GC components:
+function, plane-mask, fill-style, subwindow-mode,
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+and tile-stipple-y-origin.
+.LP
+.PN XFillRectangle
+and
+.PN XFillRectangles
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 3
+Filling a Single Polygon
+.XS
+\*(SN Filling a Single Polygon
+.XE
+.LP
+.sp
+To fill a polygon area in a given drawable, use
+.PN XFillPolygon .
+.IN "Polygons" "filling"
+.IN "Filling" "polygon"
+.IN "XFillPolygon" "" "@DEF@"
+.sM
+.FD 0
+XFillPolygon\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIpoints\fP\^, \fInpoints\fP\^, \fIshape\fP\^, \fImode\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XPoint *\fIpoints\fP\^;
+.br
+ int \fInpoints\fP\^;
+.br
+ int \fIshape\fP\^;
+.br
+ int \fImode\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fIshape\fP 1i
+Specifies a shape that helps the server to improve performance.
+You can pass
+.PN Complex ,
+.PN Convex ,
+or
+.PN Nonconvex .
+.IP \fImode\fP 1i
+Specifies the coordinate mode.
+You can pass
+.PN CoordModeOrigin
+or
+.PN CoordModePrevious .
+.LP
+.eM
+.PN XFillPolygon
+fills the region closed by the specified path.
+The path is closed
+automatically if the last point in the list does not coincide with the
+first point.
+.PN XFillPolygon
+does not draw a pixel of the region more than once.
+.PN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.PN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.LP
+Depending on the specified shape, the following occurs:
+.IP \(bu 5
+If shape is
+.PN Complex ,
+the path may self-intersect.
+Note that contiguous coincident points in the path are not treated
+as self-intersection.
+.IP \(bu 5
+If shape is
+.PN Convex ,
+for every pair of points inside the polygon,
+the line segment connecting them does not intersect the path.
+If known by the client,
+specifying
+.PN Convex
+can improve performance.
+If you specify
+.PN Convex
+for a path that is not convex,
+the graphics results are undefined.
+.IP \(bu 5
+If shape is
+.PN Nonconvex ,
+the path does not self-intersect, but the shape is not
+wholly convex.
+If known by the client,
+specifying
+.PN Nonconvex
+instead of
+.PN Complex
+may improve performance.
+If you specify
+.PN Nonconvex
+for a self-intersecting path, the graphics results are undefined.
+.LP
+The fill-rule of the GC controls the filling behavior of
+self-intersecting polygons.
+.LP
+This function uses these GC components:
+function, plane-mask, fill-style, fill-rule, subwindow-mode, clip-x-origin,
+clip-y-origin, and clip-mask.
+It also uses these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+and tile-stipple-y-origin.
+.LP
+.PN XFillPolygon
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.NH 3
+Filling Single and Multiple Arcs
+.XS
+\*(SN Filling Single and Multiple Arcs
+.XE
+.LP
+.IN "XFillArc"
+.IN "Arcs" "filling"
+.IN "Filling" "arcs"
+To fill a single arc in a given drawable, use
+.PN XFillArc .
+.IN "XFillArc" "" "@DEF@"
+.sM
+.FD 0
+XFillArc\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIangle1\fP\^, \fIangle2\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ int \fIangle1\fP\^, \fIangle2\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the drawable \
+and specify the upper-left corner of the bounding rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh , which are the major and minor axes of the arc
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIangle1\fP 1i
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+.IP \fIangle2\fP 1i
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+.LP
+.eM
+.sp
+To fill multiple arcs in a given drawable, use
+.PN XFillArcs .
+.IN "XFillArcs" "" "@DEF@"
+.sM
+.FD 0
+XFillArcs\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIarcs\fP\^, \fInarcs\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XArc *\fIarcs\fP\^;
+.br
+ int \fInarcs\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIarcs\fP 1i
+Specifies an array of arcs.
+.IP \fInarcs\fP 1i
+Specifies the number of arcs in the array.
+.LP
+.eM
+For each arc,
+.PN XFillArc
+or
+.PN XFillArcs
+fills the region closed by the infinitely thin path
+described by the specified arc and, depending on the
+arc-mode specified in the GC, one or two line segments.
+For
+.PN ArcChord ,
+the single line segment joining the endpoints of the arc is used.
+For
+.PN ArcPieSlice ,
+the two line segments joining the endpoints of the arc with the center
+point are used.
+.PN XFillArcs
+fills the arcs in the order listed in the array.
+For any given arc,
+.PN XFillArc
+and
+.PN XFillArcs
+do not draw a pixel more than once.
+If regions intersect,
+the intersecting pixels are drawn multiple times.
+.LP
+Both functions use these GC components:
+function, plane-mask, fill-style, arc-mode, subwindow-mode, clip-x-origin,
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+and tile-stipple-y-origin.
+.LP
+.PN XFillArc
+and
+.PN XFillArcs
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 2
+Font Metrics
+.XS
+\*(SN Font Metrics
+.XE
+.LP
+.IN "Font"
+A font is a graphical description of a set of characters that are used to
+increase efficiency whenever a set of small, similar sized patterns are
+repeatedly used.
+.LP
+This section discusses how to:
+.IP \(bu 5
+Load and free fonts
+.IP \(bu 5
+Obtain and free font names
+.IP \(bu 5
+Compute character string sizes
+.IP \(bu 5
+Compute logical extents
+.IP \(bu 5
+Query character string sizes
+.LP
+The X server loads fonts whenever a program requests a new font.
+The server can cache fonts for quick lookup.
+Fonts are global across all screens in a server.
+Several levels are possible when dealing with fonts.
+Most applications simply use
+.PN XLoadQueryFont
+to load a font and query the font metrics.
+.LP
+Characters in fonts are regarded as masks.
+Except for image text requests,
+the only pixels modified are those in which bits are set to 1 in the character.
+This means that it makes sense to draw text using stipples or tiles
+(for example, many menus gray-out unusable entries).
+.LP
+.sM
+The
+.PN XFontStruct
+structure contains all of the information for the font
+and consists of the font-specific information as well as
+a pointer to an array of
+.PN XCharStruct
+structures for the
+characters contained in the font.
+The
+.PN XFontStruct ,
+.PN XFontProp ,
+and
+.PN XCharStruct
+structures contain:
+.LP
+.IN "XCharStruct" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ short lbearing; /* origin to left edge of raster */
+ short rbearing; /* origin to right edge of raster */
+ short width; /* advance to next char's origin */
+ short ascent; /* baseline to top edge of raster */
+ short descent; /* baseline to bottom edge of raster */
+ unsigned short attributes; /* per char flags (not predefined) */
+} XCharStruct;
+.De
+.LP
+.IN "XFontProp" "" "@DEF@"
+.Ds 0
+.TA .5i 1i 3i
+.ta .5i 1i 3i
+typedef struct {
+ Atom name;
+ unsigned long card32;
+} XFontProp;
+.De
+.LP
+.IN "XChar2b" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct { /* normal 16 bit characters are two bytes */
+ unsigned char byte1;
+ unsigned char byte2;
+} XChar2b;
+.De
+.LP
+.IN "XFontStruct" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ XExtData *ext_data; /* hook for extension to hang data */
+ Font fid; /* Font id for this font */
+ unsigned direction; /* hint about the direction font is painted */
+ unsigned min_char_or_byte2; /* first character */
+ unsigned max_char_or_byte2; /* last character */
+ unsigned min_byte1; /* first row that exists */
+ unsigned max_byte1; /* last row that exists */
+ Bool all_chars_exist; /* flag if all characters have nonzero size */
+ unsigned default_char; /* char to print for undefined character */
+ int n_properties; /* how many properties there are */
+ XFontProp *properties; /* pointer to array of additional properties */
+ XCharStruct min_bounds; /* minimum bounds over all existing char */
+ XCharStruct max_bounds; /* maximum bounds over all existing char */
+ XCharStruct *per_char; /* first_char to last_char information */
+ int ascent; /* logical extent above baseline for spacing */
+ int descent; /* logical descent below baseline for spacing */
+} XFontStruct;
+.De
+.LP
+.eM
+X supports single byte/character, two bytes/character matrix,
+and 16-bit character text operations.
+Note that any of these forms can be used with a font, but a
+single byte/character text request can only specify a single byte
+(that is, the first row of a 2-byte font).
+You should view 2-byte fonts as a two-dimensional matrix of defined
+characters: byte1 specifies the range of defined rows and
+byte2 defines the range of defined columns of the font.
+Single byte/character fonts have one row defined, and the byte2 range
+specified in the structure defines a range of characters.
+.LP
+The bounding box of a character is defined by the
+.PN XCharStruct
+of that character.
+When characters are absent from a font,
+the default_char is used.
+When fonts have all characters of the same size,
+only the information in the
+.PN XFontStruct
+min and max bounds are used.
+.LP
+The members of the
+.PN XFontStruct
+have the following semantics:
+.IP \(bu 5
+The direction member can be either
+.PN FontLeftToRight
+or
+.PN FontRightToLeft .
+It is just a hint as to whether most
+.PN XCharStruct
+elements
+have a positive
+.Pn ( FontLeftToRight )
+or a negative
+.Pn ( FontRightToLeft )
+character width
+metric.
+The core protocol defines no support for vertical text.
+.IP \(bu 5
+If the min_byte1 and max_byte1 members are both zero, min_char_or_byte2
+specifies the linear character index corresponding to the first element
+of the per_char array, and max_char_or_byte2 specifies the linear character
+index of the last element.
+.IP
+If either min_byte1 or max_byte1 are nonzero, both
+min_char_or_byte2 and max_char_or_byte2 are less than 256,
+and the 2-byte character index values corresponding to the
+per_char array element N (counting from 0) are:
+.IP
+.nf
+ byte1 = N/D + min_byte1
+.br
+ byte2 = N\\D + min_char_or_byte2
+.IP
+.fi
+where:
+.IP
+.nf
+ D = max_char_or_byte2 \- min_char_or_byte2 + 1
+ / = integer division
+ \\ = integer modulus
+.fi
+.IP \(bu 5
+If the per_char pointer is NULL,
+all glyphs between the first and last character indexes
+inclusive have the same information,
+as given by both min_bounds and max_bounds.
+.IP \(bu 5
+If all_chars_exist is
+.PN True ,
+all characters in the per_char array have nonzero bounding boxes.
+.IP \(bu 5
+The default_char member specifies the character that will be used when an
+undefined or nonexistent character is printed.
+The default_char is a 16-bit character (not a 2-byte character).
+For a font using 2-byte matrix format,
+the default_char has byte1 in the most-significant byte
+and byte2 in the least significant byte.
+If the default_char itself specifies an undefined or nonexistent character,
+no printing is performed for an undefined or nonexistent character.
+.IP \(bu 5
+The min_bounds and max_bounds members contain the most extreme values of
+each individual
+.PN XCharStruct
+component over all elements of this array
+(and ignore nonexistent characters).
+The bounding box of the font (the smallest
+rectangle enclosing the shape obtained by superimposing all of the
+characters at the same origin [x,y]) has its upper-left coordinate at:
+.Ds
+ [x + min_bounds.lbearing, y \- max_bounds.ascent]
+.De
+.IP
+Its width is:
+.Ds
+ max_bounds.rbearing \- min_bounds.lbearing
+.De
+.IP
+Its height is:
+.Ds
+ max_bounds.ascent + max_bounds.descent
+.De
+.IP \(bu 5
+The ascent member is the logical extent of the font above the baseline that is
+used for determining line spacing.
+Specific characters may extend beyond
+this.
+.IP \(bu 5
+The descent member is the logical extent of the font at or below the
+baseline that is used for determining line spacing.
+Specific characters may extend beyond this.
+.IP \(bu 5
+If the baseline is at Y-coordinate y,
+the logical extent of the font is inclusive between the Y-coordinate
+values (y \- font.ascent) and (y + font.descent \- 1).
+Typically,
+the minimum interline spacing between rows of text is given
+by ascent + descent.
+.LP
+For a character origin at [x,y],
+the bounding box of a character (that is,
+the smallest rectangle that encloses the character's shape)
+described in terms of
+.PN XCharStruct
+components is a rectangle with its upper-left corner at:
+.LP
+.Ds
+[x + lbearing, y \- ascent]
+.De
+.LP
+Its width is:
+.LP
+.Ds
+rbearing \- lbearing
+.De
+.LP
+Its height is:
+.LP
+.Ds
+ascent + descent
+.De
+.LP
+The origin for the next character is defined to be:
+.LP
+.Ds
+[x + width, y]
+.De
+.LP
+The lbearing member defines the extent of the left edge of the character ink
+from the origin.
+The rbearing member defines the extent of the right edge of the character ink
+from the origin.
+The ascent member defines the extent of the top edge of the character ink
+from the origin.
+The descent member defines the extent of the bottom edge of the character ink
+from the origin.
+The width member defines the logical width of the character.
+.LP
+Note that the baseline (the y position of the character origin)
+is logically viewed as being the scanline just below nondescending characters.
+When descent is zero,
+only pixels with Y-coordinates less than y are drawn,
+and the origin is logically viewed as being coincident with the left edge of
+a nonkerned character.
+When lbearing is zero,
+no pixels with X-coordinate less than x are drawn.
+Any of the
+.PN XCharStruct
+metric members could be negative.
+If the width is negative,
+the next character will be placed to the left of the current origin.
+.LP
+The X protocol does not define the interpretation of the attributes member
+in the
+.PN XCharStruct
+structure.
+A nonexistent character is represented with all members of its
+.PN XCharStruct
+set to zero.
+.LP
+A font is not guaranteed to have any properties.
+The interpretation of the property value (for example, long or unsigned long)
+must be derived from \fIa priori\fP knowledge of the property.
+A basic set of font properties is specified in the X Consortium standard
+\fIX Logical Font Description Conventions\fP.
+.NH 3
+Loading and Freeing Fonts
+.XS
+\*(SN Loading and Freeing Fonts
+.XE
+.LP
+Xlib provides functions that you can use to load fonts, get font information,
+unload fonts, and free font information.
+.IN "Fonts" "getting information"
+.IN "Fonts" "unloading"
+.IN "Fonts" "freeing font information"
+A few font functions use a
+.PN GContext
+resource ID or a font ID interchangeably.
+.LP
+.sp
+To load a given font, use
+.PN XLoadFont .
+.IN "XLoadFont" "" "@DEF@"
+.sM
+.FD 0
+Font XLoadFont\^(\^\fIdisplay\fP, \fIname\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ char *\fIname\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIname\fP 1i
+Specifies the name of the font,
+which is a null-terminated string.
+.LP
+.eM
+The
+.PN XLoadFont
+function loads the specified font and returns its associated font ID.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+When the characters ``?'' and ``*'' are used in a font name, a
+pattern match is performed and any matching font is used.
+In the pattern,
+the ``?'' character will match any single character,
+and the ``*'' character will match any number of characters.
+A structured format for font names is specified in the X Consortium standard
+\fIX Logical Font Description Conventions\fP.
+If
+.PN XLoadFont
+was unsuccessful at loading the specified font,
+a
+.PN BadName
+error results.
+Fonts are not associated with a particular screen
+and can be stored as a component
+of any GC.
+When the font is no longer needed, call
+.PN XUnloadFont .
+.LP
+.PN XLoadFont
+can generate
+.PN BadAlloc
+and
+.PN BadName
+errors.
+.LP
+.sp
+To return information about an available font, use
+.PN XQueryFont .
+.IN "XQueryFont" "" "@DEF@"
+.sM
+.FD 0
+XFontStruct *XQueryFont\^(\^\fIdisplay\fP, \fIfont_ID\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XID \fIfont_ID\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_ID\fP 1i
+Specifies the font ID or the
+.PN GContext
+ID.
+.LP
+.eM
+The
+.PN XQueryFont
+function returns a pointer to the
+.PN XFontStruct
+structure, which contains information associated with the font.
+You can query a font or the font stored in a GC.
+The font ID stored in the
+.PN XFontStruct
+structure will be the
+.PN GContext
+ID, and you need to be careful when using this ID in other functions
+(see
+.PN XGContextFromGC ).
+If the font does not exist,
+.PN XQueryFont
+returns NULL.
+To free this data, use
+.PN XFreeFontInfo .
+.LP
+.sp
+To perform a
+.PN XLoadFont
+and
+.PN XQueryFont
+in a single operation, use
+.PN XLoadQueryFont .
+.IN "XLoadQueryFont" "" "@DEF@"
+.sM
+.FD 0
+XFontStruct *XLoadQueryFont\^(\^\fIdisplay\fP, \fIname\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ char *\fIname\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIname\fP 1i
+Specifies the name of the font,
+which is a null-terminated string.
+.LP
+.eM
+The
+.PN XLoadQueryFont
+function provides the most common way for accessing a font.
+.PN XLoadQueryFont
+both opens (loads) the specified font and returns a pointer to the
+appropriate
+.PN XFontStruct
+structure.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+If the font does not exist,
+.PN XLoadQueryFont
+returns NULL.
+.LP
+.PN XLoadQueryFont
+can generate a
+.PN BadAlloc
+error.
+.LP
+.sp
+To unload the font and free the storage used by the font structure
+that was allocated by
+.PN XQueryFont
+or
+.PN XLoadQueryFont ,
+use
+.PN XFreeFont .
+.IN "XFreeFont" "" "@DEF@"
+.sM
+.FD 0
+XFreeFont\^(\^\fIdisplay\fP, \fIfont_struct\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_struct\fP 1i
+Specifies the storage associated with the font.
+.LP
+.eM
+The
+.PN XFreeFont
+function deletes the association between the font resource ID and the specified
+font and frees the
+.PN XFontStruct
+structure.
+The font itself will be freed when no other resource references it.
+The data and the font should not be referenced again.
+.LP
+.PN XFreeFont
+can generate a
+.PN BadFont
+error.
+.LP
+.sp
+To return a given font property, use
+.PN XGetFontProperty .
+.IN "XGetFontProperty" "" "@DEF@"
+.sM
+.FD 0
+Bool XGetFontProperty\^(\^\fIfont_struct\fP\^, \^\fIatom\fP\^, \^\fIvalue_return\fP\^)
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.br
+ Atom \fIatom\fP\^;
+.br
+ unsigned long *\fIvalue_return\fP\^;
+.FN
+.IP \fIfont_struct\fP 1i
+Specifies the storage associated with the font.
+.IP \fIatom\fP 1i
+Specifies the atom for the property name you want returned.
+.IP \fIvalue_return\fP 1i
+Returns the value of the font property.
+.LP
+.eM
+Given the atom for that property,
+the
+.PN XGetFontProperty
+function returns the value of the specified font property.
+.PN XGetFontProperty
+also returns
+.PN False
+if the property was not defined or
+.PN True
+if it was defined.
+A set of predefined atoms exists for font properties,
+which can be found in
+.hN X11/Xatom.h .
+This set contains the standard properties associated with
+a font.
+Although it is not guaranteed,
+it is likely that the predefined font properties will be present.
+.LP
+.sp
+To unload a font that was loaded by
+.PN XLoadFont ,
+use
+.PN XUnloadFont .
+.IN "XUnloadFont" "" "@DEF@"
+.sM
+.FD 0
+XUnloadFont\^(\^\fIdisplay\fP, \fIfont\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Font \fIfont\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont\fP 1i
+Specifies the font.
+.LP
+.eM
+The
+.PN XUnloadFont
+function deletes the association between the font resource ID and the specified font.
+The font itself will be freed when no other resource references it.
+The font should not be referenced again.
+.LP
+.PN XUnloadFont
+can generate a
+.PN BadFont
+error.
+.NH 3
+Obtaining and Freeing Font Names and Information
+.XS
+\*(SN Obtaining and Freeing Font Names and Information
+.XE
+.LP
+You obtain font names and information by matching a wildcard specification
+when querying a font type for a list of available sizes and so on.
+.LP
+.sp
+To return a list of the available font names, use
+.PN XListFonts .
+.IN "XListFonts" "" "@DEF@"
+.sM
+.FD 0
+char **XListFonts\^(\^\fIdisplay\fP, \fIpattern\fP\^, \fImaxnames\fP, \fIactual_count_return\fP\^)
+.br
+ Display *\^\fIdisplay\fP\^;
+.br
+ char *\^\fIpattern\fP\^;
+.br
+ int \fImaxnames\fP\^;
+.br
+ int *\^\fIactual_count_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIpattern\fP 1i
+Specifies the null-terminated pattern string that can contain wildcard
+characters.
+.IP \fImaxnames\fP 1i
+Specifies the maximum number of names to be returned.
+.IP \fIactual_count_return\fP 1i
+Returns the actual number of font names.
+.LP
+.eM
+The
+.PN XListFonts
+function returns an array of available font names
+(as controlled by the font search path; see
+.PN XSetFontPath )
+that match the string you passed to the pattern argument.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+.PN XListFonts
+returns NULL.
+The client should call
+.PN XFreeFontNames
+when finished with the result to free the memory.
+.LP
+.sp
+To free a font name array, use
+.PN XFreeFontNames .
+.IN "XFreeFontNames" "" "@DEF@"
+.sM
+.FD 0
+XFreeFontNames\^(\^\fIlist\fP\^)
+.br
+ char *\fIlist\fP\^[\^]\^;
+.FN
+.IP \fIlist\fP 1i
+Specifies the array of strings you want to free.
+.LP
+.eM
+The
+.PN XFreeFontNames
+function frees the array and strings returned by
+.PN XListFonts
+or
+.PN XListFontsWithInfo .
+.LP
+.sp
+To obtain the names and information about available fonts, use
+.PN XListFontsWithInfo .
+.IN "XListFontsWithInfo" "" "@DEF@"
+.sM
+.FD 0
+char **XListFontsWithInfo\^(\^\fIdisplay\fP, \fIpattern\fP, \fImaxnames\fP, \fIcount_return\fP, \fIinfo_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ char *\fIpattern\fP\^;
+.br
+ int \fImaxnames\fP\^;
+.br
+ int *\fIcount_return\fP\^;
+.br
+ XFontStruct **\fIinfo_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIpattern\fP 1i
+Specifies the null-terminated pattern string that can contain wildcard
+characters.
+.IP \fImaxnames\fP 1i
+Specifies the maximum number of names to be returned.
+.IP \fIcount_return\fP 1i
+Returns the actual number of matched font names.
+.IP \fIinfo_return\fP 1i
+Returns the font information.
+.LP
+.eM
+The
+.PN XListFontsWithInfo
+function returns a list of font names that match the specified pattern and their
+associated font information.
+The list of names is limited to size specified by maxnames.
+The information returned for each font is identical to what
+.PN XLoadQueryFont
+would return except that the per-character metrics are not returned.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+.PN XListFontsWithInfo
+returns NULL.
+.LP
+To free only the allocated name array,
+the client should call
+.PN XFreeFontNames .
+To free both the name array and the font information array
+or to free just the font information array,
+the client should call
+.PN XFreeFontInfo .
+.LP
+.sp
+To free font structures and font names, use
+.PN XFreeFontInfo .
+.IN "XFreeFontInfo" "" "@DEF@"
+.sM
+.FD 0
+XFreeFontInfo(\^\fInames\fP, \fIfree_info\fP, \fIactual_count\fP\^)
+.br
+ char **\fInames\fP\^;
+.br
+ XFontStruct *\fIfree_info\fP;
+.br
+ int \fIactual_count\fP\^;
+.FN
+.IP \fInames\fP 1i
+Specifies the list of font names.
+
+.IP \fIfree_info\fP 1i
+Specifies the font information.
+
+.IP \fIactual_count\fP 1i
+Specifies the actual number of font names.
+
+.LP
+.eM
+The
+.PN XFreeFontInfo
+function frees a font structure or an array of font structures
+and optionally an array of font names.
+If NULL is passed for names, no font names are freed.
+If a font structure for an open font (returned by
+.PN XLoadQueryFont )
+is passed, the structure is freed,
+but the font is not closed; use
+.PN XUnloadFont
+to close the font.
+.NH 3
+Computing Character String Sizes
+.XS
+\*(SN Computing Character String Sizes
+.XE
+.LP
+Xlib provides functions that you can use to compute the width,
+the logical extents,
+and the server information about 8-bit and 2-byte text strings.
+.IN "XTextWidth"
+.IN "XTextWidth16"
+The width is computed by adding the character widths of all the characters.
+It does not matter if the font is an 8-bit or 2-byte font.
+These functions return the sum of the character metrics in pixels.
+.LP
+.sp
+To determine the width of an 8-bit character string, use
+.PN XTextWidth .
+.IN "XTextWidth" "" "@DEF@"
+.sM
+.FD 0
+int XTextWidth\^(\^\fIfont_struct\fP\^, \fIstring\fP, \fIcount\fP\^)
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fIcount\fP\^;
+.FN
+.IP \fIfont_struct\fP 1i
+Specifies the font used for the width computation.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIcount\fP 1i
+Specifies the character count in the specified string.
+.LP
+.eM
+.sp
+To determine the width of a 2-byte character string, use
+.PN XTextWidth16 .
+.IN "XTextWidth16" "" "@DEF@"
+.sM
+.FD 0
+int XTextWidth16\^(\^\fIfont_struct\fP\^, \fIstring\fP, \fIcount\fP\^)
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.br
+ XChar2b *\fIstring\fP\^;
+.br
+ int \fIcount\fP\^;
+.FN
+.IP \fIfont_struct\fP 1i
+Specifies the font used for the width computation.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIcount\fP 1i
+Specifies the character count in the specified string.
+.LP
+.eM
+.NH 3
+Computing Logical Extents
+.XS
+\*(SN Computing Logical Extents
+.XE
+.LP
+To compute the bounding box of an 8-bit character string in a given font, use
+.PN XTextExtents .
+.IN "XTextExtents" "" "@DEF@"
+.sM
+.FD 0
+XTextExtents\^(\^\fIfont_struct\fP\^, \fIstring\fP\^, \fInchars\fP\^, \
+\fIdirection_return\fP, \fIfont_ascent_return\fP,
+.br
+ \fIfont_descent_return\fP, \fIoverall_return\fP\^)
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInchars\fP\^;
+.br
+ int *\fIdirection_return\fP\^;
+.br
+ int *\fIfont_ascent_return\fP, *\fIfont_descent_return\fP\^;
+.br
+ XCharStruct *\fIoverall_return\fP\^;
+
+.FN
+.IP \fIfont_struct\fP 1i
+Specifies the
+.PN XFontStruct
+structure.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInchars\fP 1i
+Specifies the number of characters in the character string.
+.IP \fIdirection_return\fP 1i
+Returns the value of the direction hint
+.Pn ( FontLeftToRight
+or
+.PN FontRightToLeft ).
+.IP \fIfont_ascent_return\fP 1i
+Returns the font ascent.
+.IP \fIfont_descent_return\fP 1i
+Returns the font descent.
+.IP \fIoverall_return\fP 1i
+Returns the overall size in the specified
+.PN XCharStruct
+structure.
+.LP
+.eM
+.sp
+To compute the bounding box of a 2-byte character string in a given font, use
+.PN XTextExtents16 .
+.IN "XTextExtents16" "" "@DEF@"
+.sM
+.FD 0
+XTextExtents16\^(\^\fIfont_struct\fP\^, \fIstring\fP\^, \fInchars\fP\^, \
+\fIdirection_return\fP, \fIfont_ascent_return\fP,
+.br
+ \fIfont_descent_return\fP, \fIoverall_return\fP\^)
+.br
+ XFontStruct *\fIfont_struct\fP\^;
+.br
+ XChar2b *\fIstring\fP\^;
+.br
+ int \fInchars\fP\^;
+.br
+ int *\fIdirection_return\fP\^;
+.br
+ int *\fIfont_ascent_return\fP, *\fIfont_descent_return\fP\^;
+.br
+ XCharStruct *\fIoverall_return\fP\^;
+
+.FN
+.IP \fIfont_struct\fP 1i
+Specifies the
+.PN XFontStruct
+structure.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInchars\fP 1i
+Specifies the number of characters in the character string.
+.IP \fIdirection_return\fP 1i
+Returns the value of the direction hint
+.Pn ( FontLeftToRight
+or
+.PN FontRightToLeft ).
+.IP \fIfont_ascent_return\fP 1i
+Returns the font ascent.
+.IP \fIfont_descent_return\fP 1i
+Returns the font descent.
+.IP \fIoverall_return\fP 1i
+Returns the overall size in the specified
+.PN XCharStruct
+structure.
+.LP
+.eM
+The
+.PN XTextExtents
+and
+.PN XTextExtents16
+functions
+perform the size computation locally and, thereby,
+avoid the round-trip overhead of
+.PN XQueryTextExtents
+and
+.PN XQueryTextExtents16 .
+Both functions return an
+.PN XCharStruct
+structure, whose members are set to the values as follows.
+.LP
+The ascent member is set to the maximum of the ascent metrics of all
+characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics of all
+characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each
+.PN XChar2b
+structure is interpreted as a 16-bit number with byte1 as the
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+.NH 3
+Querying Character String Sizes
+.XS
+\*(SN Querying Character String Sizes
+.XE
+.LP
+To query the server for the bounding box of an 8-bit character string in a
+given font, use
+.PN XQueryTextExtents .
+.IN "XQueryTextExtents" "" "@DEF@"
+.sM
+.FD 0
+XQueryTextExtents\^(\^\fIdisplay\fP, \fIfont_ID\fP, \fIstring\fP, \
+\fInchars\fP, \fIdirection_return\fP, \fIfont_ascent_return\fP,
+.br
+ \fIfont_descent_return\fP, \fIoverall_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XID \fIfont_ID\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fInchars\fP\^;
+.br
+ int *\fIdirection_return\fP\^;
+.br
+ int *\fIfont_ascent_return\fP, *\fIfont_descent_return\fP\^;
+.br
+ XCharStruct *\fIoverall_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_ID\fP 1i
+Specifies either the font ID or the
+.PN GContext
+ID that contains the font.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInchars\fP 1i
+Specifies the number of characters in the character string.
+.IP \fIdirection_return\fP 1i
+Returns the value of the direction hint
+.Pn ( FontLeftToRight
+or
+.PN FontRightToLeft ).
+.IP \fIfont_ascent_return\fP 1i
+Returns the font ascent.
+.IP \fIfont_descent_return\fP 1i
+Returns the font descent.
+.IP \fIoverall_return\fP 1i
+Returns the overall size in the specified
+.PN XCharStruct
+structure.
+.LP
+.eM
+.sp
+To query the server for the bounding box of a 2-byte character string
+in a given font, use
+.PN XQueryTextExtents16 .
+.IN "XQueryTextExtents16" "" "@DEF@"
+.sM
+.FD 0
+XQueryTextExtents16\^(\^\fIdisplay\fP, \fIfont_ID\fP, \fIstring\fP, \
+\fInchars\fP, \fIdirection_return\fP, \fIfont_ascent_return\fP,
+.br
+ \fIfont_descent_return\fP, \fIoverall_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XID \fIfont_ID\fP\^;
+.br
+ XChar2b *\fIstring\fP\^;
+.br
+ int \fInchars\fP\^;
+.br
+ int *\fIdirection_return\fP\^;
+.br
+ int *\fIfont_ascent_return\fP, *\fIfont_descent_return\fP\^;
+.br
+ XCharStruct *\fIoverall_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_ID\fP 1i
+Specifies either the font ID or the
+.PN GContext
+ID that contains the font.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fInchars\fP 1i
+Specifies the number of characters in the character string.
+.IP \fIdirection_return\fP 1i
+Returns the value of the direction hint
+.Pn ( FontLeftToRight
+or
+.PN FontRightToLeft ).
+.IP \fIfont_ascent_return\fP 1i
+Returns the font ascent.
+.IP \fIfont_descent_return\fP 1i
+Returns the font descent.
+.IP \fIoverall_return\fP 1i
+Returns the overall size in the specified
+.PN XCharStruct
+structure.
+.LP
+.eM
+The
+.PN XQueryTextExtents
+and
+.PN XQueryTextExtents16
+functions return the bounding box of the specified 8-bit and 16-bit
+character string in the specified font or the font contained in the
+specified GC.
+These functions query the X server and, therefore, suffer the round-trip
+overhead that is avoided by
+.PN XTextExtents
+and
+.PN XTextExtents16 .
+Both functions return a
+.PN XCharStruct
+structure, whose members are set to the values as follows.
+.LP
+The ascent member is set to the maximum of the ascent metrics
+of all characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics
+of all characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each
+.PN XChar2b
+structure is interpreted as a 16-bit number with byte1 as the
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+.LP
+Characters with all zero metrics are ignored.
+If the font has no defined default_char,
+the undefined characters in the string are also ignored.
+.LP
+.PN XQueryTextExtents
+and
+.PN XQueryTextExtents16
+can generate
+.PN BadFont
+and
+.PN BadGC
+errors.
+.NH 2
+Drawing Text
+.XS
+\*(SN Drawing Text
+.XE
+.LP
+This section discusses how to draw:
+.IP \(bu 5
+Complex text
+.IP \(bu 5
+Text characters
+.IP \(bu 5
+Image text characters
+.LP
+The fundamental text functions
+.PN XDrawText
+and
+.PN XDrawText16
+use the following structures:
+.LP
+.IN "XTextItem" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ char *chars; /* pointer to string */
+ int nchars; /* number of characters */
+ int delta; /* delta between strings */
+ Font font; /* Font to print it in, None don't change */
+} XTextItem;
+.De
+.LP
+.IN "XTextItem16" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+ XChar2b *chars; /* pointer to two-byte characters */
+ int nchars; /* number of characters */
+ int delta; /* delta between strings */
+ Font font; /* font to print it in, None don't change */
+} XTextItem16;
+.De
+.LP
+.eM
+If the font member is not
+.PN None ,
+the font is changed before printing and also is stored in the GC.
+If an error was generated during text drawing,
+the previous items may have been drawn.
+The baseline of the characters are drawn starting at the x and y
+coordinates that you pass in the text drawing functions.
+.LP
+For example, consider the background rectangle drawn by
+.PN XDrawImageString .
+If you want the upper-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y + ascent)
+as the baseline origin coordinates to the text functions.
+The ascent is the font ascent, as given in the
+.PN XFontStruct
+structure.
+If you want the lower-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y \- descent + 1)
+as the baseline origin coordinates to the text functions.
+The descent is the font descent, as given in the
+.PN XFontStruct
+structure.
+.NH 3
+Drawing Complex Text
+.XS
+\*(SN Drawing Complex Text
+.XE
+.LP
+.IN "Text" "drawing"
+.IN "Drawing" "text items"
+.LP
+To draw 8-bit characters in a given drawable, use
+.PN XDrawText .
+.IN "XDrawText" "" "@DEF@"
+.sM
+.FD 0
+XDrawText\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XTextItem *\fIitems\fP\^;
+.br
+ int \fInitems\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIitems\fP 1i
+Specifies an array of text items.
+.IP \fInitems\fP 1i
+Specifies the number of text items in the array.
+.LP
+.eM
+.sp
+To draw 2-byte characters in a given drawable, use
+.PN XDrawText16 .
+.IN "XDrawText16" "" "@DEF@"
+.sM
+.FD 0
+XDrawText16\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIitems\fP\^, \fInitems\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XTextItem16 *\fIitems\fP\^;
+.br
+ int \fInitems\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIitems\fP 1i
+Specifies an array of text items.
+.IP \fInitems\fP 1i
+Specifies the number of text items in the array.
+.LP
+.eM
+The
+.PN XDrawText16
+function is similar to
+.PN XDrawText
+except that it uses 2-byte or 16-bit characters.
+Both functions allow complex spacing and font shifts between counted strings.
+.LP
+Each text item is processed in turn.
+A font member other than
+.PN None
+in an item causes the font to be stored in the GC
+and used for subsequent text.
+A text element delta specifies an additional change
+in the position along the x axis before the string is drawn.
+The delta is always added to the character origin
+and is not dependent on any characteristics of the font.
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+If a text item generates a
+.PN BadFont
+error, the previous text items may have been drawn.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each
+.PN XChar2b
+structure is interpreted as a 16-bit number with byte1 as the
+most significant byte.
+.LP
+Both functions use these GC components:
+function, plane-mask, fill-style, font, subwindow-mode,
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+and tile-stipple-y-origin.
+.LP
+.PN XDrawText
+and
+.PN XDrawText16
+can generate
+.PN BadDrawable ,
+.PN BadFont ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 3
+Drawing Text Characters
+.XS
+\*(SN Drawing Text Characters
+.XE
+.LP
+.IN "Strings" "drawing"
+.IN "Drawing" "strings"
+To draw 8-bit characters in a given drawable, use
+.PN XDrawString .
+.IN "XDrawString" "" "@DEF@"
+.sM
+.FD 0
+XDrawString\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+.sp
+To draw 2-byte characters in a given drawable, use
+.PN XDrawString16 .
+.IN "XDrawString16" "" "@DEF@"
+.sM
+.FD 0
+XDrawString16\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XChar2b *\fIstring\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+For fonts defined with 2-byte matrix indexing
+and used with
+.PN XDrawString16 ,
+each byte is used as a byte2 with a byte1 of zero.
+.LP
+Both functions use these GC components:
+function, plane-mask, fill-style, font, subwindow-mode, clip-x-origin,
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin,
+and tile-stipple-y-origin.
+.LP
+.PN XDrawString
+and
+.PN XDrawString16
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.NH 3
+Drawing Image Text Characters
+.XS
+\*(SN Drawing Image Text Characters
+.XE
+.LP
+.IN "Image text" "drawing"
+.IN "Drawing" "image text"
+Some applications, in particular terminal emulators, need to
+print image text in which both the foreground and background bits of
+each character are painted.
+This prevents annoying flicker on many displays.
+.IN "XDrawImageString"
+.IN "XDrawImageString16"
+.LP
+.sp
+To draw 8-bit image text characters in a given drawable, use
+.PN XDrawImageString .
+.IN "XDrawImageString" "" "@DEF@"
+.sM
+.FD 0
+XDrawImageString\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ char *\fIstring\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+.sp
+To draw 2-byte image text characters in a given drawable, use
+.PN XDrawImageString16 .
+.IN "XDrawImageString16" "" "@DEF@"
+.sM
+.FD 0
+XDrawImageString16\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIx\fP\^, \fIy\fP\^, \fIstring\fP\^, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ XChar2b *\fIstring\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.LP
+.eM
+The
+.PN XDrawImageString16
+function is similar to
+.PN XDrawImageString
+except that it uses 2-byte or 16-bit characters.
+Both functions also use both the foreground and background pixels
+of the GC in the destination.
+.LP
+The effect is first to fill a
+destination rectangle with the background pixel defined in the GC and then
+to paint the text with the foreground pixel.
+The upper-left corner of the filled rectangle is at:
+.LP
+.Ds
+[x, y \- font-ascent]
+.De
+.LP
+The width is:
+.LP
+.Ds
+overall-width
+.De
+.LP
+The height is:
+.LP
+.Ds
+font-ascent + font-descent
+.De
+.LP
+The overall-width, font-ascent, and font-descent
+are as would be returned by
+.PN XQueryTextExtents
+using gc and string.
+The function and fill-style defined in the GC are ignored for these functions.
+The effective function is
+.PN GXcopy ,
+and the effective fill-style is
+.PN FillSolid .
+.LP
+For fonts defined with 2-byte matrix indexing
+and used with
+.PN XDrawImageString ,
+each byte is used as a byte2 with a byte1 of zero.
+.LP
+Both functions use these GC components:
+plane-mask, foreground, background, font, subwindow-mode, clip-x-origin,
+clip-y-origin, and clip-mask.
+.LP
+.PN XDrawImageString
+and
+.PN XDrawImageString16
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+and
+.PN BadMatch
+errors.
+.LP
+.NH 2
+Transferring Images between Client and Server
+.XS
+\*(SN Transferring Images between Client and Server
+.XE
+.LP
+Xlib provides functions that you can use to transfer images between a client
+and the server.
+Because the server may require diverse data formats,
+Xlib provides an image object that fully describes the data in memory
+and that provides for basic operations on that data.
+You should reference the data
+through the image object rather than referencing the data directly.
+However, some implementations of the Xlib library may efficiently deal with
+frequently used data formats by replacing
+functions in the procedure vector with special case functions.
+Supported operations include destroying the image, getting a pixel,
+storing a pixel, extracting a subimage of an image, and adding a constant
+to an image (see section 16.8).
+.LP
+All the image manipulation functions discussed in this section make use of
+the
+.PN XImage
+structure,
+which describes an image as it exists in the client's memory.
+.LP
+.IN "XImage" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i 1i 3i
+.ta .5i 1i 3i
+typedef struct _XImage {
+ int width, height; /* size of image */
+ int xoffset; /* number of pixels offset in X direction */
+ int format; /* XYBitmap, XYPixmap, ZPixmap */
+ char *data; /* pointer to image data */
+ int byte_order; /* data byte order, LSBFirst, MSBFirst */
+ int bitmap_unit; /* quant. of scanline 8, 16, 32 */
+ int bitmap_bit_order; /* LSBFirst, MSBFirst */
+ int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */
+ int depth; /* depth of image */
+ int bytes_per_line; /* accelerator to next scanline */
+ int bits_per_pixel; /* bits per pixel (ZPixmap) */
+ unsigned long red_mask; /* bits in z arrangement */
+ unsigned long green_mask;
+ unsigned long blue_mask;
+ XPointer obdata; /* hook for the object routines to hang on */
+ struct funcs { /* image manipulation routines */
+ struct _XImage *(*create_image)();
+ int (*destroy_image)();
+ unsigned long (*get_pixel)();
+ int (*put_pixel)();
+ struct _XImage *(*sub_image)();
+ int (*add_pixel)();
+ } f;
+} XImage;
+.De
+.LP
+.eM
+.sp
+To initialize the image manipulation routines of an image structure, use
+.PN XInitImage .
+.IN "XInitImage" "" "@DEF@"
+.sM
+.FD 0
+Status XInitImage\^(\^\fIimage\fP\^)
+.br
+ XImage *\fIimage\fP\^;
+.FN
+.IP \fIximage\fP 1i
+Specifies the image.
+.LP
+.eM
+The
+.PN XInitImage
+function initializes the internal image manipulation routines of an
+image structure, based on the values of the various structure members.
+All fields other than the manipulation routines must already be initialized.
+If the bytes_per_line member is zero,
+.PN XInitImage
+will assume the image data is contiguous in memory and set the
+bytes_per_line member to an appropriate value based on the other
+members; otherwise, the value of bytes_per_line is not changed.
+All of the manipulation routines are initialized to functions
+that other Xlib image manipulation functions need to operate on the
+type of image specified by the rest of the structure.
+.LP
+This function must be called for any image constructed by the client
+before passing it to any other Xlib function.
+Image structures created or returned by Xlib do not need to be
+initialized in this fashion.
+.LP
+This function returns a nonzero status if initialization of the
+structure is successful. It returns zero if it detected some error
+or inconsistency in the structure, in which case the image is not changed.
+.LP
+.sp
+To combine an image with a rectangle of a drawable on the display,
+use
+.PN XPutImage .
+.IN "XPutImage" "" "@DEF@"
+.sM
+.FD 0
+XPutImage\^(\^\fIdisplay\fP, \fId\fP\^, \fIgc\fP\^, \fIimage\fP\^, \fIsrc_x\fP, \fIsrc_y\fP, \fIdest_x\fP\^, \fIdest_y\fP\^, \fIwidth\fP\^, \fIheight\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ GC \fIgc\fP\^;
+.br
+ XImage *\fIimage\fP\^;
+.br
+ int \fIsrc_x\fP\^, \fIsrc_y\fP\^;
+.br
+ int \fIdest_x\fP\^, \fIdest_y\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIimage\fP 1i
+Specifies the image you want combined with the rectangle.
+.IP \fIsrc_x\fP 1i
+Specifies the offset in X from the left edge of the image defined
+by the
+.PN XImage
+structure.
+.IP \fIsrc_y\fP 1i
+Specifies the offset in Y from the top edge of the image defined
+by the
+.PN XImage
+structure.
+.ds Dx , which are relative to the origin of the drawable \
+and are the coordinates of the subimage
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx.
+.ds Wh \ of the subimage, which define the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.LP
+.eM
+The
+.PN XPutImage
+function
+combines an image with a rectangle of the specified drawable.
+The section of the image defined by the src_x, src_y, width, and height
+arguments is drawn on the specified part of the drawable.
+If
+.PN XYBitmap
+format is used, the depth of the image must be one,
+or a
+.PN BadMatch
+error results.
+The foreground pixel in the GC defines the source for the one bits in the image,
+and the background pixel defines the source for the zero bits.
+For
+.PN XYPixmap
+and
+.PN ZPixmap ,
+the depth of the image must match the depth of the drawable,
+or a
+.PN BadMatch
+error results.
+.LP
+If the characteristics of the image (for example, byte_order and bitmap_unit)
+differ from what the server requires,
+.PN XPutImage
+automatically makes the appropriate
+conversions.
+.LP
+This function uses these GC components:
+function, plane-mask, subwindow-mode, clip-x-origin, clip-y-origin,
+and clip-mask.
+It also uses these GC mode-dependent components:
+foreground and background.
+.LP
+.PN XPutImage
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.LP
+.sp
+To return the contents of a rectangle in a given drawable on the display,
+use
+.PN XGetImage .
+This function specifically supports rudimentary screen dumps.
+.IN "XGetImage" "" "@DEF@"
+.sM
+.FD 0
+XImage *XGetImage\^(\^\fIdisplay\fP, \fId\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIplane_mask\fP, \fIformat\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ unsigned long \fIplane_mask\fP\^;
+.br
+ int \fIformat\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.ds Xy , which are relative to the origin of the drawable \
+and define the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh \ of the subimage, which define the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIplane_mask\fP 1i
+Specifies the plane mask.
+.\" *** JIM: NEED MORE INFO FOR THIS. ***
+.IP \fIformat\fP 1i
+Specifies the format for the image.
+You can pass
+.PN XYPixmap
+or
+.PN ZPixmap .
+.LP
+.eM
+The
+.PN XGetImage
+function returns a pointer to an
+.PN XImage
+structure.
+This structure provides you with the contents of the specified rectangle of
+the drawable in the format you specify.
+If the format argument is
+.PN XYPixmap ,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the plane_mask argument only requests a subset of the planes of the
+display, the depth of the returned image will be the number of planes
+requested.
+If the format argument is
+.PN ZPixmap ,
+.PN XGetImage
+returns as zero the bits in all planes not
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+.LP
+.PN XGetImage
+returns the depth of the image to the depth member of the
+.PN XImage
+structure.
+The depth of the image is as specified when the drawable was created,
+except when getting a subset of the planes in
+.PN XYPixmap
+format, when the depth is given by the number of bits set to 1 in plane_mask.
+.LP
+If the drawable is a pixmap,
+the given rectangle must be wholly contained within the pixmap,
+or a
+.PN BadMatch
+error results.
+If the drawable is a window,
+the window must be viewable,
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+.PN BadMatch
+error results.
+Note that the borders of the window can be included and read with
+this request.
+If the window has backing-store, the backing-store contents are
+returned for regions of the window that are obscured by noninferior
+windows.
+If the window does not have backing-store,
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+The pointer cursor image is not included in the returned contents.
+If a problem occurs,
+.PN XGetImage
+returns NULL.
+.LP
+.PN XGetImage
+can generate
+.PN BadDrawable ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.sp
+.LP
+To copy the contents of a rectangle on the display
+to a location within a preexisting image structure, use
+.PN XGetSubImage .
+.IN "XGetSubImage" "" "@DEF@"
+.sM
+.FD 0
+XImage *XGetSubImage\^(\^\fIdisplay\fP, \fId\fP\^, \fIx\fP\^, \fIy\fP\^, \fIwidth\fP\^, \fIheight\fP\^, \fIplane_mask\fP, \fIformat\fP\^, \fIdest_image\fP\^, \fIdest_x\fP\^,
+.br
+ \fIdest_y\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Drawable \fId\fP\^;
+.br
+ int \fIx\fP\^, \fIy\fP\^;
+.br
+ unsigned int \fIwidth\fP\^, \fIheight\fP\^;
+.br
+ unsigned long \fIplane_mask\fP\^;
+.br
+ int \fIformat\fP\^;
+.br
+ XImage *\fIdest_image\fP\^;
+.br
+ int \fIdest_x\fP\^, \fIdest_y\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fId\fP 1i
+Specifies the drawable.
+.ds Xy , which are relative to the origin of the drawable \
+and define the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.ds Wh \ of the subimage, which define the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIplane_mask\fP 1i
+Specifies the plane mask.
+.\" *** JIM: NEED MORE INFO FOR THIS. ***
+.IP \fIformat\fP 1i
+Specifies the format for the image.
+You can pass
+.PN XYPixmap
+or
+.PN ZPixmap .
+.IP \fIdest_image\fP 1i
+Specifies the destination image.
+.ds Dx , which are relative to the origin of the destination rectangle, \
+specify its upper-left corner, and determine where the subimage \
+is placed in the destination image
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx.
+.LP
+.eM
+The
+.PN XGetSubImage
+function updates dest_image with the specified subimage in the same manner as
+.PN XGetImage .
+If the format argument is
+.PN XYPixmap ,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the format argument is
+.PN ZPixmap ,
+.PN XGetSubImage
+returns as zero the bits in all planes not
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+As a convenience,
+.PN XGetSubImage
+returns a pointer to the same
+.PN XImage
+structure specified by dest_image.
+.LP
+The depth of the destination
+.PN XImage
+structure must be the same as that of the drawable.
+If the specified subimage does not fit at the specified location
+on the destination image, the right and bottom edges are clipped.
+If the drawable is a pixmap,
+the given rectangle must be wholly contained within the pixmap,
+or a
+.PN BadMatch
+error results.
+If the drawable is a window,
+the window must be viewable,
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+.PN BadMatch
+error results.
+If the window has backing-store,
+then the backing-store contents are returned for regions of the window
+that are obscured by noninferior windows.
+If the window does not have backing-store,
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+If a problem occurs,
+.PN XGetSubImage
+returns NULL.
+.LP
+.PN XGetSubImage
+can generate
+.PN BadDrawable ,
+.PN BadGC ,
+.PN BadMatch ,
+and
+.PN BadValue
+errors.
+.bp