aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/doc
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /sys/gio/doc
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/gio/doc')
-rw-r--r--sys/gio/doc/gio.hlp3498
1 files changed, 3498 insertions, 0 deletions
diff --git a/sys/gio/doc/gio.hlp b/sys/gio/doc/gio.hlp
new file mode 100644
index 00000000..f8749c23
--- /dev/null
+++ b/sys/gio/doc/gio.hlp
@@ -0,0 +1,3498 @@
+.help gio Dec84 "Graphics I/O"
+.ce
+\fBGraphics I/O Design\fR
+.ce
+Doug Tody
+.ce
+December 1984
+.ce
+(revised October 1987)
+.sp 3
+.nh
+Introduction
+
+ The graphics i/o (GIO) interface is a library of SPP or Fortran callable
+procedures for interactive vector graphics. The interface is designed primarily
+for scientific applications (graphing 1-dimensional data vectors). Limited
+support is also provided for displaying 2-dimensional image data. GIO is fully
+integrated into the IRAF system and is not intended for use in systems other
+than IRAF. The principal design objectives of GIO are outlined below.
+
+.ls
+.ls o
+Simple and efficient interactive graphics. For interactive data analysis
+applications speed is typically much more important than the quality of
+the plot.
+.le
+.ls o
+Ease of use. The interface must be easy to use for scientific data analysis
+applications. Ease of use for interactive graphics in scientific applications
+is considered more important than the flexibility required to produce
+publication quality graphics.
+.le
+.ls o
+Compact size. That portion of the graphics system required for interactive
+graphics must be small enough to be linked into every process which performs
+interactive graphics.
+.le
+.ls o
+Device independence. The interface must be device independent without
+compromising compactness and speed. True device independence means that
+an applications program that normally uses interactive graphics can be run
+noninteractively or from a nongraphics workstation.
+.le
+.le
+
+
+IRAF needs its own graphics interface partly because no existing graphics
+interface meets all of the above requirements, and partly because we do not
+want our applications to be dependent upon any particular external graphics
+package. The existing large graphics interfaces such as GKS and CORE are
+likely to make it easier to interface GIO to new graphics devices, but to
+be completely and directly dependent on any one such interface is unwise since
+implementations are sometimes hard to come by. Furthermore, packages such
+as GKS and CORE were designed to serve as the kernel of a graphics system
+and are cumbersome to use directly in applications software. GIO will serve
+as a front end to the graphics kernel, providing a higher level interface
+for applications software and isolating the IRAF applications from the kernel,
+making it possible to switch to a different kernel without rewriting the
+applications packages.
+
+.nh
+Conceptual Design
+
+ GIO is intended to be used either as a self contained interface to a
+graphics device, with GIO writing device instructions directly to the device,
+or as an interface to a more general device independent graphics kernel.
+For maximum speed in interactive applications GIO will use a special builtin
+kernel capable of driving only the interactive graphics devices in use at
+a particular site (e.g., tektronix compatible graphics terminals).
+Other devices will be driven by a device independent graphics kernel resident
+in a separate process. GIO will select the data path to be used for a
+particular device transparently to the calling program. Thus, the overhead
+of process initiation and IPC will be eliminated in common interactive
+applications without sacrificing device independence. The builtin kernel
+will be table driven using a \fBtermcap\fR format graphics device database,
+allowing maximum flexibility for adapting GIO to new graphics devices.
+
+The device independent graphics kernel may be GKS, CORE, NSPP, or any other
+reasonably capable kernel. GIO will be designed to require only a few simple
+graphics primitives at the bottom end, making it straightforward to interface
+to different graphics kernels. Any application which requires a more
+sophisticated graphics interface than that provided by GIO may bypass GIO
+and talk directly to the underlying graphics kernel, but doing so will
+render the application usable only with that particular graphics kernel.
+
+Placing the device independent graphics kernel in a separate process makes
+it possible to use a large, sophisticated graphics kernel without linking
+enormous libraries of subroutines into applications processes. Bugs can be
+fixed and new features and devices added without relinking applications
+processes. In principle it is even possible to interface simultaneously
+to more than one graphics kernel, e.g., one might drive some devices with
+an NSPP kernel and others with a GKS kernel. On a different host CORE might
+be the only thing available and GIO would have to be interfaced to CORE on
+such a host.
+
+
+.ks
+.nf
+ __________
+ / \
+ | graphics |
+ | terminal |
+ \__________/
+ | ^
+ | |(device codes)
+ v | _________
+ +--------+ +-----------+ / \
+ | CL+ |<----| graphics |<----| |
+ | fast | | kernel | | gdevice |
+ | kernel |---->| task |---->| |
+ +--------+ +-----------+ \_________/
+ | ^ |
+ | |(gki metacode) | (core metacode)
+ v | +--------> (nspp metacode)
+ +--------+ (gks vdm)
+ | user |
+ | task |-----------------------> (gki metacode)
+ +--------+
+
+
+ simple plotters
+ |--- interactive ---|------ metafile ------|
+ graphics special devices
+
+
+.fi
+.ce
+Figure 1. Graphics Task Structure
+.ke
+
+
+The IRAF command language (CL) is the user interface to IRAF programs and
+as such moderates all interaction with the user, including interaction via
+graphics devices. GIO is primarily a graphics \fIoutput\fR interface;
+graphics input (other than pixel readback) is decoupled from graphics output
+and is controlled by the CL. Often the task requesting cursor input will
+differ from that which produced the graphics. The CL, under control of the
+user, may set the default graphics input and output devices, redirect graphics
+input and/or output to devices other than the default, and control whether
+a graphics task is used interactively or in batch mode.
+
+.nh
+Specifications
+
+ The GIO graphics output procedures draw various flavors of vectors and
+fill or color two dimensional areas. Cursor input is a way of interacting
+with the user and is therefore handled by CLIO (the command language
+interface). We first define important terms and define the coordinate
+systems used by GIO. Next follows an overview of the input and output
+procedures. Finally, we describe in detail the individual procedures and
+the interface to the graphics kernel.
+
+.nh 2
+Coordinate Systems
+
+ The full plotting surface of a device defines the domain of definition
+of the coordinate systems used by GIO.
+GIO supports up to sixteen user defined \fBworld coordinate systems\fR
+(WCS) per open device, numbered 1 through 16.
+One additional coordinate system (WCS 0) with values ranging from 0 to 1 in
+either axis is predefined for every device; this \fBnormalized device
+coordinate system\fR (NDC) spans the full plotting surface of the device.
+
+The mapping of world coordinates to device coordinates is
+defined by a \fBwindow\fR into world space and a corresponding \fBviewport\fR
+into device space. Each window-viewport pair defines one of the 16 world
+coordinate systems. At \fBgopen\fR time GIO is initialized to WCS 1,
+which has both window and viewport set to NDC coordinates. A subsequent
+call to either \fBgswind\fR or \fBgscale\fR will set the window and a
+subsequent call to \fBgsview\fR will set the viewport. The WCS is not fixed
+to the device until a plotting operation occurs which requires use of the WCS.
+Hence, multiple calls to \fBgscale\fR to determine the range of data values
+in X and Y for a family of curves are possible before fixing the WCS to the
+device, e.g. in a call to \fBglabax\fR.
+
+A \fBviewport\fR is any rectangular plotting area lying entirely within the
+plotting area of the device. The viewport defines the area in which data
+can be plotted, i.e., the boundary at which \fBclipping\fR will occur if
+enabled. The viewport is the area framed by \fBglabax\fR; the tick and axis
+labels will be plotted in the area just outside the viewport.
+A square viewport need not have the same resolution in both X and Y.
+Devices with variable resolution, e.g. pen plotters, have a default
+resolution in either axis which can be overridden when the plot is drawn.
+The aspect ratio of the device is the ratio of the physical size of a
+device pixel in Y to that in X. Most devices have an aspect ratio of
+unity, but it is common for the resolution to be different in X and Y.
+The aspect ratio of the device is available via a \fBgget\fR inquiry,
+as is the device resolution in either axis.
+
+A \fBwindow\fR is the range of world coordinates which GIO will map to the
+corresponding viewport. The world coordinates must be cartesian and
+either linear or logarithmic (base 10) in either axis.
+There are no restrictions on the range of world coordinates other than
+those imposed by the single precision floating point hardware of the
+host computer, provided that the WCS is not degenerate
+(zero range in either axis).
+
+Most applications will use only a single WCS, hence the WCS number is not
+included explicitly in the argument lists of the GIO procedures.
+A call to \fBgset\fR is required to change to a different WCS.
+Thereafter all graphics output and cursor input will refer to the new WCS.
+Multiple WCS are useful when plotting in several distinct (nonoverlapping)
+viewports on a device, or when overplotting curves within the same viewport
+but with different world coordinate windows.
+
+.nh 2
+Graphics Output Procedures
+
+ The GIO output procedures range from \fBgplotv\fR and \fBgploto\fR,
+which can draw an entire plot with autoscaling and axis labeling in one call,
+to the polyline, polymarker, move, draw, and text drawing primitives at
+the low end.
+
+
+.ks
+.nf
+ gplotv (v, npts, x1, x2, title)
+ gploto (gp, v, npts, x1, x2, title)
+ gpagefile (gp, fname, prompt)
+
+ gp = gopen (device, mode, fd)
+ gclose (gp)
+ gdeactivate (gp, flags)
+ greactivate (gp, flags)
+ gcancel (gp)
+ gflush (gp)
+ gclear (gp)
+ gframe (gp)
+ greset (gp, flags)
+ gmftitle (gp, metafile_title)
+
+ gscan (gp, text)
+ gset[irs] (gp, param, value)
+ val = gstat[irs] (gp, param[, outstr, maxch])
+ val = gget[birs] (gp, devcap[, outstr, maxch])
+ g[sg]view (gp, x1, x2, y1, y2)
+ g[sg]wind (gp, x1, x2, y1, y2)
+ g[ar]scale (gp, v, npts, axis)
+ ggscale (gp, x, y, dx, dy)
+ gctran (gp, x1, y1, x2, y2, wcs1, wcs2)
+ gcurpos (gp, x, y)
+ gescape (gp, fn, instruction, nwords)
+
+ glabax (gp, title, xlabel, ylabel)
+ gline (gp, x1, y1, x2, y2)
+ gpline (gp, x, y, npts)
+ gvline (gp, v, npts, x1, x2)
+ gmark (gp, x, y, marktype, xsize, ysize)
+ gpmark (gp, x, y, npts, marktype, xsize, ysize)
+ gvmark (gp, v, npts, x1, x2, marktype, xsize, ysize)
+ gumark (gp, x, y, npts, xcen, ycen, xsize, ysize, fill)
+ g[ar]move (gp, x, y)
+ g[ar]draw (gp, x, y)
+ gtext (gp, x, y, text, format)
+ gfill (gp, x, y, npts, style)
+ g[pg]cell (gp, m, nx, ny, x1, y1, x2, y2)
+
+ gscur (gp, x, y)
+ stat = ggcur (gp, x, y, key)
+.fi
+.ke
+
+
+All coordinates are given in world coordinates (user coordinates)
+except the viewport coordinates and the marker sizes, which are given in
+device coordinates. Low level graphics i/o requires that the graphics
+device first be opened with \fBgopen\fR and later closed with \fBgclose\fR.
+Several graphics devices may be open simultaneously.
+
+When a graphics device is opened with \fBgopen\fR all internal parameters
+are initialized to their default values, unless the device is opened in
+APPEND mode. The default values of these internal parameters may be changed
+via explicit \fBgset\fR, \fBgswind\fR, \fBgscale\fR, or \fBgscan\fR calls.
+Most powerful is \fBgscan\fR, which interprets graphics commands passed
+either as an explicit string or in a text file.
+
+Much of the flexibility of GIO derives from its parameter defaulting
+mechanism. The interface may be expanded indefinitely by adding new
+internal parameters accessed via \fBgset\fR calls, without changing the
+basic interface.
+
+.nh 2
+Graphics Input Procedures
+
+ The most commonly used type of graphics input is cursor readback.
+Two forms of cursor input are supported: cursor input via the CLIO procedure
+\fBclgcur\fR, and cursor input via the GIO procedure \fBggcur\fR.
+CLIO based cursor input should be used whenever possible, i.e., when writing
+to \fBstdgraph\fR or \fBstdimage\fR. The advantage of cursor input via the
+CL is that input may come from a list file or the terminal as well as from
+a physical cursor read, allowing programs to be used either interactively
+or in batch mode. Furthermore, WCS selection and conversion of NDC cursor
+coordinates to WCS and cursor mode interaction are only available with
+\fBclgcur\fR. Programs which do not produce any graphics output may read
+the cursor via CLIO without using any part of the GIO interface.
+The lower level GIO cursor read procedure always reads the physical device
+cursor in NDC coordinates and is device dependent (it is what is called by
+\fBclgcur\fR).
+
+Cursors are implemented as abstract datatypes within the CL. A user task
+accesses a cursor by reading the value of a CL parameter of type \fBgcur\fR
+(stdgraph cursor) or \fBimcur\fR (stdimage cursor). Multiple cursors may
+be implemented using multiple cursor type parameters. A cursor parameter
+is assumed to have a \fIlist\fR of values; EOF is returned when the end of
+the list is reached. Reading the cursor automatically causes any graphics
+output to be flushed.
+
+ stat = clgcur (param, wx, wy, wcs, key, strval, maxch)
+
+The CLIO function \fBclgcur\fR reads the next cursor value from the named
+cursor parameter, returning as output arguments the cursor position in world
+coordinates, the index of the referenced WCS, the keystroke value (character
+typed) of the cursor event, and a string value if the key was ':', the
+cursor mode set option escape character.
+A cursor read sequence begins with a prompt, i.e., the cursor lights up
+or starts blinking. The user is then free to move the cursor about;
+the cursor position is not read until a key is typed on the user terminal.
+Using a keystroke on the user terminal to terminate both \fBstdgraph\fR
+and \fBstdimage\fR cursor reads provides a rich and device independent set of
+keystroke values for identifying the action to be performed (imaging devices
+are typically very limited in this area).
+
+GIO always returns the cursor position in world coordinates, along with
+the index of the WCS selected. Typically there will be exactly one world
+coordinate system (excluding WCS 0) and the WCS value may be ignored.
+If no world coordinate systems are defined for the device the cursor
+position will be returned in NDC coordinates with WCS=0.
+
+If multiple world coordinate systems are defined GIO will select the WCS
+closest to the position of the cursor, i.e., the cursor may lie outside the
+viewport and GIO will still return WCS coordinates. If the cursor lies
+within two or more overlapping viewports GIO will select the WCS with the
+highest number. The cursor read protocol will allow the user to force
+the selection of a particular viewport by first placing the cursor on a
+nonoverlapping portion of the viewport and typing a special code,
+e.g., W (see next section), and then continuing with the normal cursor read.
+If the application wishes to override the automatic WCS selection it may
+do so by calling \fBgctran\fR to transform the cursor coordinates returned
+by \fBclgcur\fR to a different world coordinate system.
+
+.nh 3
+Cursor Mode
+
+ In cursor mode, i.e., after a call to \fBclgcur\fR or after typing "=gcur",
+a number of special keystrokes shall be recognized for interactive display
+control. All graphics output to stdgraph and stdimage is routed through the
+CL on the way to the graphics kernel. The CL will optionally spool in an
+internal buffer all graphics instructions output to an interactive device.
+This internal buffer is emptied whenever the device screen is cleared.
+In cursor mode, special keystrokes may be used to redraw all or any portion
+of the spooled graphics, e.g., one may zoom in on a portion of the plot and
+then roam about on the plot at high magnification. Since the spooled graphics
+vectors typically contain more information than can be displayed at normal
+magnification, zooming in on a feature may bring out additional detail
+(the maximum resolution is 32768 points in either axis). Increasing the
+magnification will increase the precision of the cursor by the same factor.
+
+Cursor mode is implemented by performing coordinate transformation and
+clipping on each GKI instruction in the frame buffer, passing the transformed
+and clipped instructions on to the graphics kernel.
+The cursor mode operations perform a simple geometric transformation on
+the spooled graphics frame, mapping a rectangular window of the spooled
+frame onto the device screen. The graphics frame itself is not modified,
+hence zoom out or reset and redraw will restore the original display.
+
+If the graphics frame is a typical vector plot with drawn and labeled
+axes, magnifying a portion of the plot may cause the axes to be lost.
+If this is not what is desired a keystroke is provided to draw and label
+the axes of the displayed window. The axes will be overplotted on the
+current display and will not be saved in the frame buffer, hence they
+will be lost when the frame is redrawn. In cursor mode the viewport is
+the full display area of the output device, hence the tick mark labels
+of the drawn axes will be drawn inside the viewport. This form of axes
+labeling is used because it is simple and because it is appropriate for
+both vector graphics and image display output devices (and cursor mode
+must serve both).
+
+
+.ks
+.nf
+ A draw and label the axes of current viewport
+ B backup over last instruction in frame buffer
+ C print the cursor position as it moves
+ D draw a line by marking the endpoints
+ E expand plot by setting window corners
+ F set fast cursor (for HJKL)
+ H step cursor left
+ J step cursor down
+ K step cursor up
+ L step cursor right
+ M move point under cursor to center of screen
+ P zoom out (restore previous expansion)
+ R redraw the screen
+ T draw a text string
+ U undo last frame buffer edit
+ V set slow cursor (for HJKL)
+ W select WCS at current position of cursor
+ X zoom in, X only
+ Y zoom in, Y only
+ Z zoom in, both X and Y
+ < set lower limit of plot to the cursor y value
+ > set upper limit of plot to the cursor y value
+ \ escape next character
+ : set cursor mode options
+ :! send a command to the host system
+ = shorthand for :.snap (make graphics hardcopy)
+ 0 reset and redraw
+ 1-9 roam
+.fi
+.ce
+Figure 2. Cursor Mode Keystrokes
+.ke
+
+
+By default the cursor mode keystrokes are all upper case letters, reserving
+lower case for applications programs. The terminal shift lock key may be
+used to simplify typing in lengthy interactive cursor mode sessions.
+The cursor motions are decoupled from roam since zoom and roam are often used
+merely to increase the precision of a cursor read. Special keystrokes are
+provided for stepwise cursor motions to increase the speed of cursor setting
+on terminals that do not have fast cursor motions (e.g., the retro-graphics
+enhanced VT100). The recognized keystrokes are shown in Figure 2.
+
+If the character : is typed while in cursor mode the alpha cursor will appear
+at the bottom of the screen, allowing a command line to be entered. Commands
+which begin with a period, e.g., ":." are interpreted by the graphics system;
+any other command will terminate the cursor read, returning the character ':'
+as the key value, and the command string as the string value of the cursor
+read. The commands recognized by the graphics system are summarized in
+figure 3.
+
+
+.ks
+.nf
+ :.axes[+-] draw axes of viewport whenever screen is redrawn
+ :.case[+-] enable case sensitivity for keystrokes
+ :.clear clear alpha memory (e.g, this text)
+ :.cursor n select cursor (0=normal,1=crosshair,2=lightpen)
+ :.gflush flush plotter output
+ :.help print help text for cursor mode
+ :.init initialize the graphics system
+ :.markcur[+-] mark cursor position after each cursor read
+ :.off [keys] disable selected cursor mode keys
+ :.on [keys] enable selected cursor mode keys
+ :.page[+-] enable screen clear before printing help text
+ :.read file fill frame buffer from a file
+ :.show print cursor mode and graphics kernel status
+ :.snap [device] make hardcopy of graphics display
+ :.txqual qual set character generator quality (normal,l,m,h)
+ :.txset format set text drawing parameters (size,up,hj,vj,etc)
+ :.xres=value set X resolution (stdgraph only)
+ :.yres=value set Y resolution (stdgraph only)
+ :.viewport x1 x2 y1 y2 set workstation viewport in world coordinates
+ :.write[!][+] file save frame buffer in a spool file
+ :.zero reset viewport and redraw frame
+.fi
+
+
+.ce
+Figure 3. Cursor Mode Commands
+.ke
+
+
+Minimum match abbreviations are permitted for cursor mode command names.
+Multiple commands may be given on one line, delimited by semicolons.
+If the CL environment variable \fBcminit\fR is defined when cursor mode is
+first entered, the string value will be interpreted as a cursor mode command
+and used for initialization. For example, to disable the numeric keys and
+set the graphics resolution to 200 points in X and 100 points in Y, one
+could add the following \fBset\fR declaration to their "login.cl" file:
+
+ set cminit = "xres=200; yres=150; off 0-9"
+
+The numeric keypad of the terminal (if it has one) is used to roam about
+when the zoom factor is greater than one. If the magnification is normal
+the numeric keys are not recognized as special keystrokes, i.e., typing
+a numeric key will exit cursor mode, returning the character typed to the
+applications program. In roam mode a numeric key must be escaped to exit
+cursor mode. The directional significance of the numeric keys in roam
+mode is obvious if the terminal has a keypad, and is illustrated below.
+
+
+.ks
+.nf
+ 7 8 9 135 090 045
+
+ 4 5 6 180 000 000
+
+ 1 2 3 225 -90 -45
+.fi
+.ke
+
+
+There is a fixed upper limit on the size of the cursor mode frame buffer.
+If the frame data overflows the frame buffer while plotting the plot will
+still come out correctly, but only the final plotting instructions will be
+retained in the buffer. Redisplay of the frame in cursor mode will thus
+result in only a portion of the full frame being drawn. If this is a problem
+the user can increase the upper limit on the size of the frame buffer by
+setting the value of the environment variable \fBcmbuflen\fR, e.g.,
+
+ gflush; set cmbuflen = 512000
+
+would initialize the graphics system (freeing the old frame buffer) and set
+the upper limit on the size of the frame buffer to 512K words or 1Mb.
+
+.nh 2
+Example
+
+ At this point a brief example may help to illustrate the use of the GIO
+procedures. The following procedure will plot a data vector (pixel array)
+and then repeatedly read the cursor, drawing a mark at successive positions
+of the cursor. The procedure exits if the user types either the character
+'q' or EOF, e.g., <ctrl/z> or carriage return.
+
+
+.ks
+.nf
+ include <gset.h>
+
+ # MARKPLOT -- Plot a data array and then enter a loop, drawing
+ # circles at successive cursor positions.
+
+ procedure markplot (data, npts, x1, x2)
+
+ real data[npts] # data vector to be plotted
+ int npts # length of array
+ real x1, x2 # world X-coords of vector
+
+ pointer gp
+ int wcs, key
+ char str[32]
+ real wx, wy
+ pointer gopen()
+ int clgcur()
+
+ begin
+ gp = gopen ("stdgraph", NEW_FILE, STDGRAPH)
+
+ call gploto (gp, data, npts, x1, x2, "data")
+
+ while (clgcur ("points", wx, wy, wcs, key, str, 32) != EOF)
+ if (key == 'q')
+ break
+ else
+ call gmark (gp, wx, wy, GM_CIRCLE, 1., 1.)
+
+ call gclose (gp)
+ end
+.fi
+.ke
+
+.nh 2
+Graphics Output Devices
+
+ While the graphics output device may be specified explicitly by name,
+more often graphics output devices will be specified by one of the logical
+device names shown below. Examples of the installation dependent device name
+associated with each logical name are also shown.
+
+
+.ks
+.nf
+ stdgraph = "gterm"
+ stdimage = "deanza"
+ stdplot = "qms"
+ stdvdm = "uparm$vdm"
+.fi
+.ke
+
+
+Interaction (via the CL) is supported only for \fBstdgraph\fR and
+\fBstdimage\fR. The standard batch plotter device is \fBstdplot\fR,
+and the standard metafile (for spooling graphics output) is \fBstdvdm\fR.
+
+The user should not normally set the value of \fBstdgraph\fR directly with
+\fIset\fR, rather they should set the terminal type with \fIstty\fR and let
+the latter specify the value of \fBstdgraph\fR. If the terminal specified
+is not a graphics terminal (no ":gd" capability in the termcap entry for the
+device) the value of \fBstdgraph\fR will be set to "none", otherwise
+\fBstdgraph\fR will be set to the name of the stdgraph device entry for the
+graphics terminal.
+
+The device name associated with a logical graphics output
+device must have an associated entry in the \fBgraphcap\fR file,
+a text file used to describe the characteristics of each device.
+New graphcap entries may easily be added by the user to interface to
+special graphics devices.
+System privledge is not required to modify graphcap, since the name
+of the graphcap file is taken from a CL environment variable of the
+same name (which can be redefined by the user to point to a file in a
+private directory). The graphcap entries for the most commonly used
+devices at a given site may be precompiled by the system manager to
+eliminate the overhead of searching the graphcap file at \fBgopen\fR time.
+
+The graphcap parameters (device \fIcapabilities\fR) are too involved to
+be presented here and will be described in a later section.
+Examples of device capabilities are the device resolution, whether a frame
+advance is required before or after a plot, indication of device capabilities
+such as the ability to generate text, and the name of the executable
+graphics kernel file associated with the device. Many additional parameters
+are defined for interactive devices. The graphcap device capabilities
+may be inspected with the \fBgget[birs]\fR procedures, which resolve into
+calls to the TTY interface, used to access both graphcap and termcap files.
+
+The sequence of actions taken by GIO to access the graphcap entry for a
+device is summarized below.
+
+
+.ks
+.nf
+ if (standard graphics output device)
+ get device name from environment
+
+ if (device name is actually a filename) {
+ load graphics device descriptor using the first device entry
+ from the named graphcap format file
+ } else {
+ get filename of graphcap file from environment
+ load graphics device descriptor by searching the graphcap file
+ for the named device
+ }
+.fi
+.ke
+
+.nh 2
+Graphics Input Devices
+
+ The technique used to associate an input source with a graphics cursor
+is similar to that used for output devices. A CL environment variable is
+associated with each cursor type. The names and default values of the
+environment variables are shown below.
+
+
+.ks
+.nf
+ stdgcur = "stdgraph"
+ stdimcur = "stdimage"
+.fi
+.ke
+
+
+The default input source for a cursor is the graphics output device associated
+with the graphics output stream. If the cursor device is "stdgraph" or
+"stdimage" the graphics kernel is called to read the physical device cursor
+for \fIstdgraph\fR or \fIstdimage\fR. If the cursor device is "text"
+the cursor value is a line of text read from the user terminal.
+In this mode the user enters at least two of the fields defining
+a cursor value. Missing fields are assigned the value zero (the user
+presumably will know that the program does not use the extra fields).
+
+
+.ks
+.nf
+ cl> set stdgcur = "text"
+ cl> = gcur
+ gcur: 345.33 23.22 1 c
+ 345.33 23.22 1 c
+ cl>
+.fi
+.ke
+
+
+An example of a cursor read request entered interactively by the user,
+taking input from the terminal and sending output to the terminal,
+is shown above (the CL typed the "gcur: " query and the user entered the
+remainder of that line). If the cursor device were "stdgraph" a real
+cursor read would occur and the equivalent interaction might appear as
+shown below. The cursor position is returned in world coordinates,
+where the world coordinate system was defined by the last plot output to
+the device. For an imaging device the world coordinates will typically
+be the pixel coordinates of the image section being displayed.
+
+
+.ks
+.nf
+ cl> = gcur
+ 345.33 23.22 1 c
+ cl>
+.fi
+.ke
+
+
+Redirecting cursor input to the terminal is useful when working from a
+nongraphics workstation and when debugging programs. ASCII cursor queries
+are the only type supported when running an IRAF program outside the CL.
+Cursor input may also be taken from a list file by assigning a filename
+to a cursor parameter, i.e., by assigning a list file to a list structured
+parameter and overriding query mode:
+
+
+.ks
+.nf
+ cl> gcur = filename
+ cl> = gcur
+ 345.33 23.22 1 c
+ cl>
+.fi
+.ke
+
+
+This last mechanism is a standard technique used with CL list structured
+parameters and will not be discussed further here.
+
+.NH 2
+Mixed Terminal and Graphics I/O
+
+ Interactive graphics programs are normally (but not necessarily) executed
+on a graphics terminal or workstation supporting both ordinary terminal i/o
+and vector graphics. IRAF is designed to use a single terminal for both text
+and graphics; text and graphics on separate devices is also supported but is
+not the norm. By text we refer here to ordinary line or screen oriented
+terminal i/o (e.g., for \fIhelp\fR or \fIeparam\fR), not the use of text in
+the graphics plane to annotate plots.
+
+.NH 3
+Text and Graphics Mode
+
+ Most modern graphics terminals provide separate memory planes for text
+and graphics. Depending upon the device, these planes may be displayed
+simultaneously, displayed alternately, or only a single memory plane may be
+available for both terminal modes, in which case a mode switch is destructive.
+The graphics device model implemented by GIO and the STDGRAPH kernel is
+flexible enough to deal with all or nearly all such devices.
+
+The normal mode for the terminal or workstation is text mode. Activating the
+workstation causes a switch to graphics mode; deactivating the workstation
+restores the terminal to text mode. Activation is implied whenever a device
+is opened with \fBgopen\fR, unless the AW_DEFER mode bit is set to defer the
+activate workstation until graphics i/o is actually done to the device.
+Closing the workstation automatically deactivates the workstation. The GIO
+procedures \fBgreactivate\fR and \fBgdeactivate\fR are provided to simplify
+mode switching while a device is open on a graphics stream.
+
+Occasionally it is necessary to print out a large amount of text in response
+to a user command entered in a cursor loop while in graphics mode. If the
+text is in a file this is done most easily by calling \fBgpagefile\fR to page
+the file in text mode, restoring graphics mode when the operation is completed.
+If the application generates the output text dynamically then the workstation
+must be explicitly deactivated and later reactivated before resuming graphics
+i/o, e.g.,
+
+.ks
+.nf
+ while (clgcur (gp, ...) != EOF) {
+ switch (key) {
+ case XXX:
+ call gdeactivate (gp, AW_CLEAR)
+ <write the text to STDOUT>
+ call greactivate (gp, AW_PAUSE)
+ case YYY:
+ ...
+ }
+ }
+.fi
+.ke
+
+The sequence shown will switch to text mode, clear the screen, output the
+text, and pause for the user to read the text before restoring graphics mode
+and initiating another cursor read.
+
+.NH 3
+Status Line I/O
+
+ The deactivate/reactivate workstation technique is fine for outputting
+large amounts of text, but is not well suited for small amounts of text,
+e.g., single line commands to interactively set internal parameters,
+output of single lines of text to prompt the user, print the value of a
+calculation or some variable, and so on. The so-called "status line"
+interface is provided for this purpose. Status line i/o makes it possible
+to interact directly with the user without interfering with the contents of
+the graphics frame, and without leaving graphics mode.
+
+What the status line actually is determined by the graphcap entry for the
+device and the characteristics or limitations of the actual device.
+On most devices, the status line is a single line at the bottom of the screen.
+This only works, however, if the device can dynamically erase the status line;
+if this is not possible the status "line" may actually be the entire screen,
+with successive output lines being drawn on top of the graph.
+
+To output text to the status line while in graphics mode one merely writes to
+STDOUT or STDERR in the usual way, e.g., in a call to \fBprintf\fR. When
+newline is seen a flag is set which causes the status line to be cleared when
+the next output character is received. Output lines may be built up in
+successive calls to output procedures, outputting a single newline to terminate
+the line and start a new one. After a newline delimited line of text has been
+output, output of a single newline (blank line) will clear the status line.
+
+It is also possible to read from the status line. This is most commonly done
+after writing a prompt string to the status line. The prompt should be
+terminated with a colon (e.g., "enter value: ") rather than a newline,
+to signal to the user that input is expected, and to avoid having the
+subsequent status line read clear the prompt string. In many cases such
+explicit prompting and decoding of the return string can be avoided by using
+the standard CLIO parameter prompting mechanism for interactive input.
+CL parameter prompts are also permitted in graphics mode, and will interact
+with the user on the status line in the expected way, without interfering
+with the graphics state of the device.
+
+When mixing status line i/o and graphics i/o one must be careful to flush any
+buffered graphics or textual output before switching modes. In many cases the
+system will do this for you automatically, but there are exceptions where
+explicitly flushing of buffered output is necessary (e.g., STDOUT and STDERR
+are low level facilities with no knowledge of GIO, and output to one of these
+streams will not automatically cause any graphics output to be flushed).
+
+.NH 2
+User Interface Conventions
+
+ While different interactive (cursor driven) graphics programs will differ
+in many ways, there are certain operations which are common to all such
+programs. In order to present a more consistent interface to the user,
+conventions have been defined for these common operations.
+
+.NH 3
+On Line Help
+
+ All interactive graphics programs should respond to the key '?' with a
+description of the keystrokes and colon commands recognized by the program
+(or submenu, in the case of a menu structured interface). This is normally
+done by calling \fBgpagefile\fR to interactively page the ".key" keystrokes
+help file for the program. The keystroke files for system programs are
+stored in the directory lib$scr; non-system programs keep their keys files
+either in the package directory, or in a global package library.
+
+.NH 3
+Cursor and Device Names
+
+ In general, applications programs should not read directly from \fBgcur\fR
+or \fBimcur\fR (the global cursor parameters), nor should the open the
+"stdgraph", "stdimage", or "stdplot" device directly by these explicit string
+values. This works, but is inflexible. To make it easy for the user to
+run an otherwise interactive program in batch mode, taking input from a cursor
+list file, the task should include a cursor type parameter in its parameter
+set. Likewise, to make it easy for the user to temporarily redirect the
+output of the program to a device other than the current stdgraph, stdplot,
+etc., device, the device name should be parameterized as a string type CL
+parameter.
+
+For example, if task \fBplotit\fR has cursor and device parameters named
+"cursor" and "device", the command
+
+ cl> plotit cursor=listfile device=qms
+
+would run the task taking cursor input from the text file "listfile", with
+stdgraph graphics output directed to the plotter device "qms".
+
+.NH 3
+Exiting an Interactive Cursor Loop
+
+ The following standards have been defined for dealing with EOF/quit in
+interactive cursor loops.
+.ls
+.ls EOF
+End of file is indicated for a cursor list either by an actual
+end of file in the case of a true cursor list, or by typing the EOF character
+(e.g., <ctrl/z>, <ctrl/d>, or the interrupt character) in an interactive
+cursor read. EOF on the cursor list should be taken seriously by the
+applications program, and not treated as just another key, hence it should
+not be something that the user is expected to type routinely to exit a cursor
+loop. If a program gets EOF back as the value of \fBclgcur\fR it should exit
+immediately, without any verification queries etc, since it may well have
+been run in batch mode with input redirected to a cursor list file.
+.le
+.ls q
+The standard interactive cursor loop exit character is 'q'.
+All interactive graphics programs should recognize this character
+and take some action to exit the cursor loop, e.g.:
+
+.ks
+.nf
+ while (clgcur (...) != EOF)
+ switch (key) {
+ case 'q':
+ break
+ case ...
+.fi
+.ke
+
+The 'q' character is intended to be handled directly by the application
+program, rather than mapped into EOF by the system (like Q was, and CR and
+the gt_gcur 'q' before that in old versions of IRAF),
+to distinguish this case from a hard-EOF and to provide maximum
+flexibility in how the program treats a request from the user to exit.
+If the user would suffer from an accidental program exit then the 'q' key
+action should do something before exiting, e.g., ask that the user first
+update the database, ask that CR be hit to verify the quit, and so on.
+In general, if it would take the user more than a minute to recover after
+an accidental program exit, one should consider coding some sort of
+verification action to be executed before exiting when 'q' is typed (but not
+when EOF is seen on the list).
+.le
+.le
+
+The GIO procedure \fBgqverify\fR is provided for programming convenience in
+cases where only simple verification is desired. Note that lightweight tasks
+or submenus which can easily be reentered should not bother even with this,
+but should simply exit. For example:
+
+.ks
+.nf
+ case 'q':
+ if (gqverify() == YES)
+ break
+.fi
+.ke
+
+As a more complex example, suppose the program is used to edit or
+create a database which could be lost or damaged in an accidental
+exit, if not updated first. We do not want to update the database
+automatically because this would overwrite the former contents of
+the database. The program might be set up as follows.
+
+.ks
+.nf
+ 'q' program prints error message on status line, e.g.,
+ "No write since last change (:quit! overrides)"
+ :w[rite] updates the database; q will execute silently
+ :q[uit]! force a quit w/o an update; discard changes
+.fi
+.ke
+
+.nh 2
+Detailed Procedure Specifications
+
+ The graphics output procedures provided by GIO fall into four main
+groups. First are the high level "plot at a time" procedures,
+used to plot entire data vectors. Second are the control procedures,
+used to open and close a device, to flush output and clear the screen,
+and to cancel output in the event of an interrupt.
+Third are the procedures used to set and stat (inquire) the GIO
+internal parameters, e.g. to define a WCS, change pens, select axis labeling
+options, or inquire the device resolution. Fourth and last are the output
+procedures, used to draw and label the axes of a viewport, set the cursor,
+draw lines or marks, plot text, or fill areas.
+
+.nh 3
+High Level Procedures
+.ls 4
+.tp 8
+.ls gplotv (v, npts, x1, x2, title)
+
+.nf
+real v[npts] # data vector
+int npts # number of data points
+real x1, x2 # WC assigned v[1] and v[npts]
+char title[ARB] # plot title
+.fi
+
+Open GIO, clear the screen, autoscale and plot the data vector, then close GIO.
+A default viewport is used. The axes are drawn, tick marks are selected,
+marked, and labeled, and the plot title is printed. The data is plotted
+using solid line segments. The X values of the data points are evenly
+distributed from X1 to X2.
+.le
+
+.tp 8
+.ls gploto (gp, v, npts, x1, x2, title)
+
+.nf
+pointer gp # graphics descriptor
+real v[npts] # data vector
+int npts # number of data points
+real x1, x2 # WC assigned v[1] and v[npts]
+char title[ARB] # plot title
+.fi
+
+A more flexible version of \fBgplotv\fR. The graphics device must already
+have been opened with an explicit call to \fBgopen\fR. The explicit open
+call makes it possible to append to an existing plot or to change plotting
+options with calls to \fBgset\fR before calling \fBgploto\fR to autoscale,
+draw the axes, and plot the data vector. Annotation of the plot via calls
+to the low level output primitives is possible before a final call to
+\fBgclose\fR to close the device and free the graphics descriptor.
+.le
+
+.tp 8
+.ls gpagefile (gp, fname, prompt)
+
+.nf
+pointer gp # graphics descriptor
+char fname[ARB] # file to be paged
+char prompt[ARB] # end of page prompt string
+.fi
+
+Interactively page through a file on the terminal in text mode, e.g., to
+display help text in response to the '?' standard help query key.
+The workstation is deactivated, the screen is cleared and the file is paged,
+with the usual file pager prompt being displayed at the bottom of each page
+of text. When the pager is exited the workstation is reactivated if it was
+active when the pager was called. If the prompt string is null the file
+name is used.
+.le
+.le
+
+.nh 3
+Control Procedures
+.ls
+.tp 8
+.ls gopen (device, mode, fd)
+
+.nf
+char device[ARB] # name of device to be opened
+int mode # access mode
+int fd # graphics stream to be written
+.fi
+
+The named graphics device is opened for graphics i/o. A pointer to the GIO
+graphics descriptor assigned to the device is returned as the function value.
+The device name may be the name of one of the standard logical graphics
+devices, i.e., \fBstdgraph\fR, \fBstdimage\fR, \fBstdplot\fR, or \fBstdvdm\fR,
+or the actual name of a physical device.
+
+The only meaningful device access modes at present are NEW_FILE and APPEND.
+In NEW_FILE mode all WCS are initialized to NDC coordinates.
+Opening the stdgraph device in NEW_FILE mode causes a screen clear on the next
+call to \fIgflush\fR. In APPEND mode the WCS are restored to the values they
+had when the device was last accessed.
+The GIO internal state variables are initialized to their default values
+at \fBgopen\fR time regardless of the access mode for the device.
+
+Opening the stdgraph device causes an implicit reactivate workstation unless
+the AW_DEFER flag (<gset.h>) is set in the access mode, e.g.,
+
+ gp = gopen (device, NEW_FILE+AW_DEFER, fd)
+
+Defer mode allows the graphics descriptor to be opened once, e.g., during task
+startup, before any graphics output is required. This is sometimes useful in
+applications which switch back and forth between text and graphics mode often,
+by bracketing each graphics sequence with calls to \fIgreactivate\fR to enter
+graphics mode, and \fIgdeactivate\fR to return to text mode. Defer mode may
+be combined with any normal access mode code.
+
+Graphics output will be written to the stream \fIfd\fR, which may be one
+of the standard streams STDGRAPH, STDIMAGE, or STDPLOT, or to a binary file
+opened explicitly by the user before calling \fBgopen\fR.
+.le
+
+.tp 5
+.ls gclose (gp)
+
+The graphics device associated with graphics descriptor \fBgp\fR is closed,
+freeing all resources allocated to the device. Any buffered graphics output
+is automatically flushed before closing the device.
+.le
+
+.tp 4
+.ls gdeactivate (gp, flags)
+
+.nf
+pointer gp # graphics descriptor
+int flags # AW_CLEAR, AW_PAUSE (see <gset.h>)
+.fi
+
+The graphics workstation is deactivated, i.e., restored to the normal terminal
+(text drawing) mode, the state the terminal was in prior to \fIgopen\fR, and to
+which it will be restored after a \fIgclose\fR. This function is intended for
+interactive graphics applications and may be may be ignored by some graphics
+kernels. If the AW_PAUSE flag bit is set the user will be asked to type a
+key before the terminal is restored to text mode. If the AW_CLEAR flag bit
+is set the terminal (text) screen will be cleared after the workstation is
+deactivated.
+
+.le
+
+.tp 4
+.ls greactivate (gp, flags)
+
+.nf
+pointer gp # graphics descriptor
+int flags # AW_CLEAR, AW_PAUSE (see <gset.h>)
+.fi
+
+The graphics workstation is reactivated, i.e., restored to graphics mode from
+the normal terminal (text drawing) mode. This function is intended for
+interactive graphics applications and may be may be ignored by some graphics
+kernels. If the AW_PAUSE flag bit is set the user will be asked to type a
+key before the terminal is restored to graphics mode. If the AW_CLEAR flag
+bit is set the graphics frame will be cleared.
+.le
+
+.tp 4
+.ls gcancel (gp)
+
+Any buffered graphics output is discarded and any output operation currently
+in progress is aborted. Used to recover from an interrupt.
+.le
+
+.tp 3
+.ls gflush (gp)
+
+Any buffered graphics output is flushed to the output device.
+.le
+
+.tp 4
+.ls gclear (gp)
+
+If the output device is a CRT the screen is erased (including all viewports).
+If the output device is a plotter a formfeed is issued, advancing to the next
+page of output (whether or not any graphics output has occurred).
+All WCS are initialized to NDC coordinates and the internal state of GIO
+is initialized, i.e., the state of each drawing instruction attribute packet
+is set to UNSET to force retransmission to the graphics kernel as i/o occurs,
+and the current settings of the \fIgset\fR options, e.g., line style and width,
+\fIglabax\fR options, etc., are all initialized to their default (\fBgopen\fR)
+values.
+.le
+
+.tp 4
+.ls gframe (gp)
+
+Issue a screen clear or frame advance. This call is equivalent to \fBgclear\fR
+except that the internal state of GIO is not initialized. An application
+might want to call \fBgframe\fR and \fBgreset\fR directly rather than using
+\fBgclear\fR, if the full initialization implied by \fBgclear\fR is not what
+is desired.
+.le
+
+.tp 4
+.ls greset (gp, flags)
+
+.nf
+pointer gp # graphics descriptor
+int flags # bitflags noting what to reset (0 is a no-op)
+.fi
+
+The \fBgreset\fR may be used to reset all or parts of the internal state of
+GIO, without actually doing any i/o to the graphics device. The \fIflags\fR
+argument is used to specify what is to be reset. The bitflags (defined in
+<gset.h>) are enumerated below.
+
+.nf
+ GR_RESETALL reset everything
+ GR_RESETGIO reset only GIO drawing parameters
+ GR_RESETWCS reset the WCS to wcs=1, all NDC
+ GR_RESETGLABAX reset the GLABAX parameters
+.fi
+
+A \fBgclear\fR is equivalent to a \fBgframe\fR followed by a
+greset(gp,GR_RESETALL).
+.le
+
+.tp 8
+.ls gmftitle (gp, mftitle)
+
+.nf
+pointer gp # graphics descriptor
+char mftitle[ARB] # comment (metafile title string)
+.fi
+
+Place a comment describing the graphics being generated in the output
+stream. Useful primarily when the output is expected to be saved in a
+metafile. No graphics is generated.
+.le
+.le
+
+.nh 3
+Set and Stat Procedures
+.ls
+.tp 8
+.ls gscan (gp, text) [NOT YET IMPLEMENTED]
+
+.nf
+pointer gp # graphics descriptor
+char text[ARB] # graphics commands
+.fi
+
+The string \fBtext\fR, consisting of an arbitrary length sequence of
+printable ASCII graphics commands delimited by semicolons or newlines,
+is interpreted and executed by GIO. Each GIO procedure has a corresponding
+command of the same syntax, minus the parenthesis, commas, and the argument
+\fBgp\fR. The syntax of a \fBgset\fR command is "param=value".
+File inclusion is provided by the operator "@" followed by the filename
+of the file to be included.
+The include operator may appear anywhere a token is expected and includes
+may be nested up to some maximum depth.
+The sequence "@STDIN" is especially useful for entering commands or data
+interactively.
+.le
+
+.tp 8
+.ls gset[irs] (gp, param, value)
+
+.nf
+pointer gp # graphics descriptor
+int param # parameter to be set
+[irs] value # new value for parameter
+.fi
+
+Set the value of the indicated parameter. A separate procedure is used for
+integer, real, and string valued parameters, i.e., gseti, gsetr, gsets.
+GIO parameters may be either internal state variables (e.g. the number of
+ticks on an axis) or device parameters (e.g. the number of the pen to be
+used to draw lines).
+The GIO parameters are defined in the global include file \fB<gset.h>\fR.
+.le
+
+.tp 10
+.sp
+.nf
+gstati (gp, param)
+gstatr (gp, param)
+gstats (gp, param, outstr, maxch)
+.fi
+.ls
+.nf
+pointer gp # graphics descriptor
+int param # parameter to be set
+char outstr[maxch] # output string
+.fi
+
+Inquire the value of the indicated GIO internal parameter.
+The integer and real functions \fBgstati\fR and \fBgstatr\fR return
+the parameter value as the function value, whereas \fBgstats\fR is
+a procedure returning the string value of a parameter as an output argument.
+The GIO parameters are defined in the global include file \fB<gset.h>\fR.
+.le
+
+.tp 11
+.sp
+.nf
+ggetb (gp, cap)
+ggeti (gp, cap)
+ggetr (gp, cap)
+ggets (gp, cap, outstr, maxch)
+.fi
+.ls
+.nf
+pointer gp # graphics descriptor
+char cap[2] # device capability
+char outstr[maxch] # output string
+.fi
+
+Inquire the value of the indicated graphics device capability.
+The device capability \fIcap\fR is the two character name of the capability
+as it appears in the \fIgraphcap\fR file. Aside from the device capabilities
+required by GIO, GIO itself knows nothing about the graphcap device
+capabilities. New capabilities may be added without modifying GIO.
+The \fBgget\fR procedures call the corresponding procedures in the TTY
+interface. If more control over device capabilities is required than
+that provided by GIO, the TTY interface may be used directly, following a
+call to \fBgstati\fR to get the pointer to the TTY descriptor for the device.
+
+The boolean function \fBggetb\fR tests whether the device has the named
+capability. The integer and real functions \fBggeti\fR and \fBggetr\fR return
+the capability value as the function value, or zero if the capability is
+not defined for the device. String valued capabilities are returned by
+\fBggets\fR as an output argument; the null string is returned if the
+device does not have the indicated capability.
+.le
+
+.tp 8
+.ls g[sg]view (gp, x1, x2, y1, y2)
+
+.nf
+pointer gp # graphics descriptor
+real x1, x2 # range of NDC coordinates in X
+real y1, y2 # range of NDC coordinates in Y
+.fi
+
+Set or get the NDC coordinates of the viewport associated with the current WCS.
+The default viewport is the full display area of the device.
+.le
+
+.tp 8
+.ls g[sg]wind (gp, x1, x2, y1, y2)
+
+.nf
+pointer gp # graphics descriptor
+real x1, x2 # range of world coordinates in X
+real y1, y2 # range of world coordinates in Y
+.fi
+
+Set or get the world coordinates of the window associated with the current WCS.
+The default window ranges from 0 to 1 in both X and Y, i.e., the default
+window associates a normalized coordinate system with the associated viewport.
+Any window limits passed as INDEF will be ignored, i.e., those window
+parameters will not be modified.
+.le
+
+.tp 9
+.ls g[ar]scale (gp, v, npts, axis)
+
+.nf
+pointer gp # graphics descriptor
+real v[npts] # data vector window is to be scaled to
+int npts # length of data vector
+int axis # axis to be scaled (1=X, 2=Y).
+.fi
+
+Set absolute (\fIgascale\fR) or rescale (\fBgrscale\fR) the minimum and
+maximum world coordinates of the indicated axis of the current window,
+i.e., scale the window to fit a data vector.
+May be called repeatedly if overplotting several curves. The current minimum
+and maximum values for either axis may be obtained at any time by calling
+\fBggwind\fR. To scale the window to fit a family of curves,
+call \fBgascale\fR for the first curve and \fBgrscale\fR for the remaining
+curves, thereby computing the range in X and or Y of all curves.
+.le
+
+.tp 9
+.ls ggscale (gp, x, y, dx, dy)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # point at which scale is desired (wc)
+real dx, dy # scale, wcs units per ndc unit
+.fi
+
+Determine the scale in world coordinate units at the point (x,y). Useful
+for computing the size of an object in world coordinates given its size
+in ndc coordinates, or vice versa. An approximation is used to determine
+the scale if log scaling is in use. Note that the scale is a function of
+position for the nonlinear coordinate systems.
+.le
+
+.tp 9
+.ls gctran (gp, x1, y1, x2, y2, wcs1, wcs2)
+
+.nf
+pointer gp # graphics descriptor
+real x1, y1 # input point in WCS1 coords
+real x2, y2 # output point in WCS2 coords
+int wcs1, wcs2 # input, output world coordinate systems
+.fi
+
+Transform a point in world coordinate system \fIwcs1\fR to world coordinate
+system \fIwcs2\fR. If \fIwcs1\fR is zero the transformation is from NDC
+coordinates to WCS coordinates. If \fIwcs2\fR is zero the transformation is
+from WCS coordinates to NDC coordinates. Otherwise the transformation is
+between two user defined world coordinate systems. The point need not fall
+within the viewports of the two world coordinate systems. World coordinate
+systems which were never set are equivalent to WCS=0.
+.le
+
+.tp 9
+.ls gcurpos (gp, x, y)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # current pen position in world coordinates
+.fi
+
+Return the "current pen position" in the current world coordinate system.
+The current pen position is the position set by the last move or draw
+command.
+.le
+
+.tp 10
+.ls gescape (gp, fn, instruction, nwords)
+
+.nf
+pointer gp # graphics descriptor
+int fn # function code
+short instruction[nwords] # instruction sequence to be passed
+int nwords # length of instruction sequence
+.fi
+
+Send a device dependent instruction sequence to the graphics kernel.
+Escape functions are ignored by GIO and by graphics kernels that do
+not recognize the function code.
+.le
+.le
+
+.nh 3
+Output Procedures
+
+ Data passed to the polyline or polymarker output procedures may contain
+embedded INDEF (indefinite) values in the X, Y, or V arrays. Indefinite valued
+points appear as gaps in the plot and are ignored when autoscaling.
+Indefinite valued pixels are not permitted in a cell array since GIO does
+not look at the values of the pixels.
+
+.ls
+.tp 9
+.ls glabax (gp, title, xlabel, ylabel)
+
+.nf
+pointer gp # graphics descriptor
+char title[ARB] # plot title
+char xlabel[ARB] # X axis label
+char ylabel[ARB] # Y axis label
+.fi
+
+Draw and label the axes of the viewport.
+If the WCS has not yet been fixed it will be fixed by this call.
+If desired, \fBglabax\fR may modify the window slightly to place
+simple values on the tick marks. Numerous \fBgset\fR options are
+available for controlling the number and sizes of the tick marks,
+the format of tick labels, the axes on which tick labels appear,
+and so on. If the device viewport has not yet been set and axis labeling
+is enabled, \fBglabax\fR will set a default size viewport which allows room
+for the label text outside the viewport.
+.le
+
+.tp 8
+.ls gline (gp, x1, y1, x2, y2)
+
+.nf
+pointer gp # graphics descriptor
+real x1, y1 # start of line
+real x2, y2 # end of line
+.fi
+
+Draw a line connecting the point (x1,y1) to the point (x2,y2) (WCS coordinates).
+The linetype, linewidth, and color may be changed beforehand with a call
+to \fBgset\fR. The relevant parameters and their possible values are shown
+below. Linetype zero (clear) may be used to erase lines drawn with any of the
+other linetypes (device permitting).
+
+.ks
+.nf
+ G_PLTYPE 0=clear, 1=solid, 2=dashed, 3=dotted,
+ 4=dotdash, >4=device dependent
+ G_PLWIDTH relative line width (default 1.0)
+ G_PLCOLOR color index
+.fi
+.ke
+.le
+
+.tp 8
+.ls gpline (gp, x, y, npts)
+
+.nf
+pointer gp # graphics descriptor
+real x[npts] # X coordinates of the line endpoints
+real y[npts] # Y coordinates of the line endpoints
+int npts # number of line endpoints
+.fi
+
+Polyline. Draw a line connecting the points (WCS coordinates).
+The linetype, linewidth, and color may be changed beforehand with a call
+to \fBgset\fR.
+.le
+
+.tp 8
+.ls gvline (gp, v, npts, x1, x2)
+
+.nf
+pointer gp # graphics descriptor
+real v[npts] # vector to be plotted (Y values)
+int npts # number of line endpoints
+real x1, x2 # range of vector in X
+.fi
+
+Vector polyline. Draw a polyline wherein the Y values of the polyline are
+taken from V and the X values are evenly distributed along the X-axis,
+ranging from X1 at point V[1] to X2 at point V[npts] (WCS coordinates).
+.le
+
+.tp 9
+.ls gmark (gp, x, y, marktype, xsize, ysize)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # WCS coordinates of marker
+int marktype # marker type
+real xsize, ysize # marker sizes
+.fi
+
+Mark drawing primitive. Draw a mark of type \fImarktype\fR and size
+\fImarksize\fR at the given position in WCS coordinates.
+The marker type codes recognized are shown below and are defined in <gset.h>.
+Marktype codes may be summed to make composite marks, e.g.,
+
+ call gmark (gp, x, y, GM_PLUS+GM_CROSS, 1.)
+
+is an asterisk. The pseudo-mark GM_FILL may be combined with GM_CIRCLE,
+GM_BOX, or GM_DIAMOND to output the mark as a filled area, using the current
+fill area attributes. A positive \fImarksize\fR specifies the mark size in NDC
+coordinates, whereas negative signifies WCS coordinates.
+The positive marksizes 1., 2., 3., and 4. signify default size marks of
+increasing size.
+
+.ks
+.nf
+ typecode name symbol
+
+ 0 GM_POINT smallest plottable point
+ 1 GM_FILL fill interior of mark
+ 2 GM_BOX square box
+ 4 GM_PLUS plus
+ 8 GM_CROSS cross
+ 16 GM_DIAMOND diamond
+ 32 GM_HLINE horizontal line
+ 64 GM_VLINE vertical line
+ 128 GM_HEBAR horizontal error bar
+ 256 GM_VEBAR vertical error bar
+ 512 GM_CIRCLE circle
+.fi
+.ke
+
+The linetype for a mark is set by the parameter G_PMLTYPE. A mark may
+be erased (device permitting) by setting the marker linetype to clear and
+redrawing the mark. The color index used for marks is controlled by the
+\fBgset\fR parameter G_PMCOLOR.
+.le
+
+.tp 9
+.ls gpmark (gp, x, y, npts, marktype, xsize, ysize)
+
+.nf
+pointer gp # graphics descriptor
+real x[npts] # WCS X coordinates of markers
+real y[npts] # WCS Y coordinates of markers
+int npts # number of markers
+int marktype # marker type
+real xsize, ysize # marker sizes
+.fi
+
+Polymarker. Plot a sequence of \fInpts\fR markers at the positions given
+by successive WCS coordinate pairs (x[i],y[i]). All markers will be of
+the same type and size. The significance of the marker type and size codes
+is the same as for \fBgmark\fR.
+.le
+
+.tp 9
+.ls gvmark (gp, v, npts, x1, x2, marktype, xsize, ysize)
+
+.nf
+pointer gp # graphics descriptor
+real v[npts] # WCS Y coordinates of markers
+int npts # number of markers
+real x1, x2 # range of WCS X coordinates
+int marktype # marker type
+real xsize, ysize # marker sizes
+.fi
+
+Vector polymarker. Plot a sequence of \fInpts\fR markers at the positions given
+by successive WCS coordinate pairs (x[i],y[i]), where the x[i] are evenly
+distributed from X1 at V[1] to X2 at V[npts]. All markers will be of the same
+type and size. The significance of the marker type and size codes is the same
+as for \fBgmark\fR.
+.le
+
+.tp 11
+.ls gumark (gp, x, y, npts, xcen, ycen, xsize, ysize, fill)
+
+.nf
+pointer gp # graphics descriptor
+real x[npts],y[npts] # normalized polyline defining marker
+int npts # number of points in polyline
+real xcen, xcen # world coordinates of center of marker
+real xsize, ysize # marker size in X and Y
+int fill # draw mark using area fill
+.fi
+
+Draw a user defined marker. The marker is defined by the polyline (X[i],Y[i]),
+normalized to the unit square. The marker polyline is scaled to fit the
+window defined by \fIxcen\fR, \fIycen\fR, \fIxsize\fR, and \fIysize\fR,
+where the center is always defined in world coordinates but the marker sizes
+may be defined in any of a number of ways (see \fBgmark\fR). If \fIfill\fR
+is YES the marker will be drawn using area fill rather than as a polyline.
+.le
+
+.tp 8
+.ls g[ar]move (gp, x, y)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # WCS coordinates to move or shift
+.fi
+
+Move absolute (\fBgamove\fR) or move relative (\fBgrmove\fR),
+with the "pen up". A move relative should be preceded by a move absolute
+to unambiguously define the "current pen position" in WCS coordinates.
+Only the move, draw, and mark primitives leave the pen in a defined position.
+Calls to \fBgset\fR may be intermixed with move and draw commands without
+affecting the current pen position.
+.le
+
+.tp 8
+.ls g[ar]draw (gp, x, y)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # WCS coordinates to move or shift
+.fi
+
+Move absolute (\fBgadraw\fR) or move relative (\fBgrdraw\fR),
+with the "pen down". Draws a line segment.
+The type of line drawn (linetype or "pen number") defaults to solid but
+may be changed beforehand with a call to \fBgset\fR.
+Calls to \fBgset\fR may be intermixed with move and draw commands without
+affecting the current pen position.
+.le
+
+.tp 9
+.ls gtext (gp, x, y, text, format)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # WCS coordinates of text string
+char text[ARB] # text to be plotted
+char format[ARB] # text characteristics
+.fi
+
+Plot the string \fItext\fR at the position (x,y) in WCS coordinates.
+The default size, orientation, and justification of the generated string
+may be set by a prior call to \fBgset\fR or overridden for the duration
+of the current call by the \fIformat\fR string. A null format string
+is permtted.
+
+
+.ks
+.nf
+ keyword values default
+
+ up degrees ccw, zero = +x 90
+ size character size scale factor 1.0
+ path left,right,up,down r
+ hjustify normal,center,left,right l
+ vjustify normal,center,top,bottom b
+ font roman,greek,italic,bold r
+ quality normal,low,medium,high n
+ color integers greater than one 1
+.fi
+.ke
+
+
+The attributes controlling how text is generated are shown above.
+The character up vector (attribute \fIup\fR) defines the horizontal and
+vertical axes (the horizontal axis is perpendicular to the character up
+vector). Directions left and right, up and down are relative to these axes.
+The attribute \fIpath\fR defines the direction in which characters are
+to be plotted. The attribute \fBquality\fR makes it possible to choose
+between low or medium quality (fast) and high quality (expensive) character
+generation techniques, e.g., hardware versus software character generation.
+This attribute is normally best set to "normal" and then overridden at
+metafile translation time.
+
+The attributes are set in the format string by a semicolon delimited list of
+keyword=value constructs. Only the first character of keyword and value
+strings is significant, i.e., keywords and values may be abbreviated to as
+little as one character if desired. For example, the format "p=d;v=c"
+would plot characters downward in a vertical string centered at the position
+given.
+
+The default font is set by the font attribute at the beginning of each call.
+Font changes may also be signaled by placing the sequence "\fF" in the text,
+where F is one of the characters RGIB, denoting the fonts roman, greek,
+italic, and bold. In this manner the font may change from character
+to character within a single line of text. Additional escape sequences may
+be added to represent special symbols.
+.le
+
+.tp 10
+.ls gfill (gp, x, y, npts, style)
+
+.nf
+pointer gp # graphics descriptor
+real x[npts] # X coordinates of polygon
+real y[npts] # Y coordinates of polygon
+int npts # number of vertices of polygon
+int style # type of fill
+.fi
+
+Area fill. The points (x[i],y[i]) define a closed area which will be filled
+in the indicated \fIstyle\fR. The recognized style codes, defined in <gset.h>,
+are:
+
+.ks
+.nf
+ 0 GF_CLEAR clear area
+ 1 GF_HOLLOW draw only outline of area
+ 2 GF_SOLID fill area with a color
+ 3-6 GF_HATCH[1234] fill area with a pattern
+ 7-N device dependent
+.fi
+.ke
+
+If the device can support multiple colors the color index for area fill may
+be set beforehand with a call to \fBgset\fR to set the parameter G_FILLCOLOR.
+.le
+
+.tp 10
+.ls gpcell (gp, m, nx, ny, x1, y1, x2, y2)
+
+.nf
+pointer gp # graphics descriptor
+short m[nx,ny] # greylevels or colors (pixels)
+int nx, ny # number of pixels in X and Y
+real x1, y1 # lower left corner of output area
+real x2, y2 # upper right corner of output area
+.fi
+
+Output a cell array.
+Map each pixel in the input array into the corresponding area
+of the output device. For maximum efficiency the resolution of M should
+match that of the area of the output device defined by the window (x1,y1)
+and (x2,y2), otherwise M is subsampled or replicated to best fill the output
+area. The aspect ratio of a pixel need not be preserved in the mapping.
+The pixel values (greylevels or color indices) are passed on to the kernel
+without modification.
+.le
+
+.tp 7
+.ls gscur (gp, x, y)
+
+.nf
+pointer gp # graphics descriptor
+real x, y # new cursor position
+.fi
+
+Move the device cursor to the indicated position (WCS coordinates).
+.le
+.le
+
+.nh 3
+Input Procedures
+
+ Input procedures are available for cursor and pixel input. Inquiry of GIO
+parameters and device capabilities is handled by the \fBgstat\fR and \fBgget\fR
+procedures and is not considered graphics input.
+
+.ls
+.tp 8
+.ls clgcur (param, wx, wy, wcs, key, strval, maxch)
+
+.nf
+char param[ARB] # CL parameter to be input
+real wx, wy # world coordinates of cursor event
+int wcs # index of WCS selected
+int key # keystroke value of cursor event
+char strval[maxch] # string value if set option (key = ':')
+int maxch # max chars to be returned in strval
+.fi
+
+The next value of the list structured CL cursor type parameter \fIparam\fR
+is read and the cursor coordinates in WCS units are decoded and returned
+as output arguments, along with the WCS number and the keystroke value,
+i.e., the character typed by the user causing the cursor to be read.
+The range of keystroke values is the full ASCII character set, minus a system
+dependent subset of control codes (if a physical cursor is read, the read is
+always terminated by the user typing a key on the user terminal).
+No GIO device need be open to read the cursor. EOF is returned as the
+function value when the end of the cursor list is reached.
+The number of output arguments successfully decoded is returned as the
+function value for a normal read. Values not converted are set to zero.
+.le
+
+.tp 8
+.ls ggcur (gp, sx, sy, key)
+
+.nf
+pointer gp # graphics descriptor
+real sx, sy # NDC coordinates of cursor event
+int key # keystroke value of cursor event
+.fi
+
+The physical cursor of the graphics device associated with graphics
+descriptor \fIgp\fR is read and the cursor coordinates in NDC units are
+returned as output arguments, along with the keystroke value, i.e.,
+the character typed or button pushed causing the cursor to be read.
+On many devices the cursor read will be instantaneous (the cursor position
+will be sampled), and the keystroke value will always be zero. The range
+of possible keystroke values is device dependent. EOF is returned as the
+function value when the end of the cursor list is reached. An error action
+is taken if the device is not readable. The GIO device must have previously
+been opened with \fBgopen\fR.
+
+Use of this low level procedure is not recommended since it forces a program
+to be used interactively, operation is device dependent, and cursor mode
+interaction is not supported. The main uses for \fBggcur\fR are cursor input
+from special graphics devices, i.e., devices other than \fBstdgraph\fR or
+\fBstdimage\fR, and continuous sampling of the cursor position on devices
+which support it. The characteristics of the device cursors are described
+in the graphcap entry for the device.
+.le
+
+.tp 10
+.ls ggcell (gp, m, nx, ny, x1, y1, x2, y2)
+
+.nf
+pointer gp # graphics descriptor
+short m[nx,ny] # output pixel array
+int nx, ny # number of pixels out in X and Y
+real x1, y1 # lower left corner of input area
+real x2, y2 # upper right corner of input area
+.fi
+
+Input a cell array. The cell array defined by the rectangular window
+from point (x1,y1) to (x2,y2) is read into the output array M of size
+NX columns by NY lines.
+For maximum efficiency the resolution of the output array should match
+that of the device area defined by the input window.
+If the resolution of the output array does not match that of the device
+output lines will be subsampled or replicated to best fit the output array.
+Unaddressable pixels are returned as negative values. An error action is
+taken if the device is not readable.
+.le
+.le
+
+.nh 2
+GIO Internal Parameters
+
+ The GIO internal parameters may be set with either a \fBgset\fR or
+\fBgscan\fR call, and inspected with a \fBgstat\fR function call.
+Parameters are identified to \fBgset\fR and \fBgscan\fR by an integer
+code. Each integer code is assigned a symbolic name of the form G_PARAM
+in the include file <gset.h>. In input to \fBgscan\fR, parameters are
+referred to by name in lower case, without the "g_" prefix. The parameters
+and their default values are shown below.
+
+
+.tp 5
+.nf
+ \fBparameter default description\fR
+
+ wcs 1 index of current WCS
+ xtran linear linear, log, or nlog (WCS attribute)
+ ytran linear linear, log, or nlog (WCS attribute)
+ clip yes clip at viewport boundary (WCS attribute)
+ cursor 1 current cursor number
+ pltype 1 polyline linetype
+ plwidth 1.0 polyline relative line width
+ plcolor 1 polyline color index
+ pmltype 1 polymarker linetype
+ pmcolor 1 polymarker color index
+ szmarker[1-4] (.5:2)*ch standard marker sizes, NDC coordinates
+ fastyle 1 fill area interior style
+ facolor 1 fill area color index
+ txsize 1.0 relative character size
+ txup 90 character up vector
+ txpath right direction in which characters are drawn
+ txspacing 0.0 character spacing relative to height
+ txhjustify left horizontal justification (n,c,l,r)
+ txvjustify bottom vertical justification (n,c,t,b)
+ txfont roman text font (roman,greek,italic,bold)
+ txquality normal text generator precision (n,l,m,h)
+ txcolor 1 text color index
+.fi
+
+.tp 9
+.nf
+ (axis labeling parameters)
+
+ drawtitle yes draw plot title if given
+ titlesize 1.0 character size for plot title
+ titlejust center horizontal justification of title
+ ntitlelines 1 number of lines in title block
+ aspect 0.0 aspect ratio of viewport (0=dontcare)
+
+ (the following are duplicated for the Y axis)
+
+ xdrawaxes 3 draw X axis 1, 2, both (3), none (0)
+ xsetaxispos no set world coords of X axes
+ xaxispos1 0.0 world coord of X axis 1 (default wx1)
+ xaxispos2 0.0 world coord of X axis 2 (default wx2)
+ xdrawgrid yes draw grid marks connecting X ticks
+ xround no extend WCS to end at a tick mark
+ xlabelaxis yes draw axis label string if given
+ xaxislabelsize 1.0 character size for X axis label
+ xdrawticks yes draw and label X ticks
+ xlabelticks yes label X ticks
+ xnmajor 6 number of major ticks in X
+ xnminor 4 number of minor ticks in X
+ xmajorlength 0.8ch length of a major tick, X
+ xminorlength 0.4ch length of a minor tick, X
+ xmajorwidth 1.0 linewidth of a major tick, X
+ xminorwidth 1.0 linewidth of a minor tick, X
+ xaxiswidth 1.0 linewidth of the axis
+ xticklabelsize 1.0 character size for X tick labels
+ xtickformat "" override format for X tick labels
+.fi
+
+.tp 4
+.nf
+ (read only variables)
+
+ tty - pointer to TTY graphcap descriptor
+ fd - file descriptor of output stream
+ devname - device name as passed to gopen
+.fi
+
+
+The Y axis parameters have names equivalent to those shown with the
+X prefix replaced by a Y. If the prefix is omitted entirely then the
+parameters for both axes will be set or queried.
+The \fBglabax\fR code and parameters are built upon the GIO graphics
+primitives and may be replaced by a more sophisticated user program
+if desired.
+
+Drawing and labeling of the X and Y axes is parameterized independently
+in X and Y. If drawing and labeling of an axis is disabled, tick drawing
+and labeling is automatically disabled. Drawing and labeling of an axis
+may be disabled on only one side of the viewport (useful when a single viewport
+is used simultaneously for two different world coordinate systems).
+If tick drawing is disabled tick labeling is automatically disabled.
+The tick marks, if drawn, may be connected by dotted lines within the
+interior of the plot.
+
+Given the approximate number of major ticks, GIO will compute the nearest
+number of tick marks resulting in round numbers for the tick mark labels.
+If rounding is enabled the window will be enlarged to the nearest tick
+outward on either end of an axis, otherwise an axis will end at the window
+boundary, which need not fall on a tick mark.
+If linear scaling is indicated \fInminor\fR minor ticks will be drawn
+between each pair of major ticks. If log scaling is indicated the
+\fInmajor\fR and \fInminor\fR parameters are ignored and
+major ticks will be placed at powers of ten with eight minor ticks
+(e.g., 2,3,4,5,6,7,8,9) between each pair of major ticks.
+Tick lengths are given in NDC coordinates. The default tick lengths
+are parameterized in terms of the character height for the device.
+
+
+.nh 2
+Graphcap Parameters
+
+ Each logical graphics device accessible to GIO must have an entry
+in the \fBgraphcap\fR (graphics capabilities) file. The name of the
+device entry in the graphcap file must agree with that specified in the
+\fBgopen\fR call when the device is opened. Multiple logical device
+entries may be given for a single physical device, each with slightly
+different parameters. The name of the graphcap file is parameterized
+by the CL environment variable "graphcap", making it easy for the user
+to customize or extend the graphcap file. The graphcap entries for
+common devices may be precompiled by the system manager to eliminate
+the overhead of searching the graphcap file at run time.
+
+The format of the graphcap file is identical to that of a UNIX \fBtermcap\fR
+file, and indeed the same interface (TTY) is used to access both types of files.
+The set of capabilities defined for a graphics device is however quite
+different than that defined for a terminal. Capabilities are typed
+parameters referred to by a two character internal name. The restriction to
+two characters is perhaps unfortunate but is desirable for efficiency reasons
+(as well as for compatablity with the original termcap) and may be alleviated
+at some point in the future by the use of macro defines.
+
+Graphcap parameters fall into two classes, those parameters which are
+common to all devices, and those parameters which are required only for
+devices accessed with a particular graphics kernel. GIO is capable
+of supporting any number of quite different kernels, each of which may
+support any number of devices. These kernels are free to add parameters
+to their graphcap entries provided they do not conflict with the standard
+parameters. An example is the "fast" or \fBstdgraph\fR kernel, discussed
+in detail in a later section. If a device is to be accessed by more than
+one kernel each kernel must typically have its own graphcap entry for the
+device, with selection of the graphcap entry (logical device name)
+specifying the kernel to be used.
+
+In the discussion which follows the reader is assumed to already be familiar
+with the syntax and usage of \fBtermcap\fR format files. This is documented,
+for example, in section 5 of the UNIX manuals. A sample termcap entry for
+the devices "vt100-nam" and "vt100-am" is included below as an example of
+a typical termcap entry.
+
+
+.tp 5
+.nf
+d1|vt100|vt100-nam|vt100 w/no am:\
+ :am@:xn@:tc=vt100-am:
+d0|vt100|vt100-am|vt100|dec vt100:\
+ :cr=^M:do=^J:nl=^J:bl=^G:co#80:li#24:cl=50\E[;H\E[2J:\
+ :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
+ :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
+ :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:is=\E[1;24r\E[24;1H:\
+ :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :if=/usr/lib/tabset/vt100:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\
+ :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:ta=^I:pt:sr=5\EM:vt#3:xn:\
+ :k5=\EOp:k6=\EOx:k7=\EOr:k8=\EOm:k9=\EOl:k0=\EOq:\
+ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:ks=\E[?1h\E=:ke=\E[?1l\E>:
+.fi
+
+
+Note that each device may be known by several names. The device capabilities
+are delimited by colons, e.g., ":xx=...:yy=...:". The special capability "tc"
+allows an entry to include another entry recursively. Escape is represented
+as either "\E" or "^[", <ctrl/h> is "^H". If a delay of so many milliseconds
+is required after transmission of a string, the number of milliseconds
+appears as the first few chars in an entry, e.g., "cl=50..." causes a
+delay of 50 milliseconds following a screen clear. Numeric capabilities are
+prefaced by a sharp, e.g., ":co#80:" (screen has 80 columns).
+
+
+.nh 3
+Generic GRAPHCAP Parameters
+
+ To make the distinction between the generic and kernel graphcap parameters
+clear and to eliminate the possibility of redefinitions, the generic
+parameters have lower case names and the kernel parameters have upper case
+names. Only the standard graphcap parameters should be accessed from within
+applications programs. The standard parameters are listed and defined below.
+These parameters should be included in the graphcap entry for every device.
+
+.ls 4
+.ls 15 ar real
+Aspect ratio dY/dX, i.e., the ratio of the size of the device screen in Y to
+that in X (equivalent to ys/xs).
+.le
+.ls ca bool
+Device implements cellarray plotting in hardware, i.e, the \fIzr\fR greylevels
+are displayed by the hardware rather than emulated by software in the kernel.
+.le
+.ls ch real
+Height in NDC units of a character of size 1.0.
+.le
+.ls co int
+Number of columns of text displayable on the device screen at character
+size 1.0.
+.le
+.ls cw real
+Width in NDC units of a character of size 1.0.
+.le
+.ls fa bool
+Device implements fill area in hardware.
+.le
+.ls fs int
+Number of fill area styles supported by the device.
+.le
+.ls in bool
+Device supports at least one input function, i.e., cursor readback or cell
+array input.
+.le
+.ls k1 int
+Minimum possible key value in a cursor read.
+.le
+.ls k2 int
+Maximum possible key value in a cursor read.
+.le
+.ls kf str
+Filename of the executable graphics kernel file for the device.
+If this is given as "cl", the kernel is assumed to be resident in the
+CL process. Should be a virtual filename, e.g., "dev$x_device.e".
+See also parameter \fItn\fR.
+.le
+.ls li int
+Number of lines of text displayable on the device screen at character
+size 1.0.
+.le
+.ls lt int
+Number of linetypes supported by the device.
+.le
+.ls lw int
+Number of linewidths supported by the device.
+.le
+.ls nc int
+Number of cursors supported by the device.
+.le
+.ls nk int
+Number of possible key values in a cursor read.
+.le
+.ls pl bool
+Device implements polyline drawing in hardware.
+.le
+.ls pm bool
+Device implements polymarker drawing in hardware.
+.le
+.ls ro bool
+Device supports roam at the hardware level (used in cursor mode).
+.le
+.ls se bool
+Device supports selective erase of portions of the screen.
+.le
+.ls tf int
+Number of text fonts supported by the device.
+.le
+.ls th int
+Number of text heights or sizes supported by the device. If absent or zero
+it is assumed that characters may be freely scaled in size. If only a number
+of discreet character sizes are available the sizes are given by the
+parameters \fItN\fR.
+.le
+.ls tn str
+Taskname, i.e., name of the logical task within the kernel file \fIkf\fR
+to be run to exercise a kernel.
+.le
+.ls tq int
+Number of text quality or precision levels supported by the device.
+.le
+.ls tN real
+Sizes of the \fIth\fR possible character sizes, relative to a character
+of size 1.0 (expands to the set of parameters t1,t2,...,tN).
+.le
+.ls tx bool
+Device implements text generation in hardware.
+.le
+.ls wc bool
+Reading the cursor implies a wait, i.e., a cursor read is triggered by
+the user.
+.le
+.ls xr int
+Device resolution in X.
+.le
+.ls xs real
+Device scale in X, i.e., the width of the display area in meters.
+.le
+.ls yr int
+Device resolution in Y.
+.le
+.ls ys real
+Device scale in Y, i.e., the height of the display area in meters.
+.le
+.ls zo bool
+Device supports zoom at the hardware level (used in cursor mode).
+.le
+.ls zr int
+Device resolution in Z, i.e., the number of greylevels or colors displayable
+at each point using the cell array primitive.
+.le
+.le
+
+
+The graphcap parameters are accessed by name via \fBgget\fR calls.
+For example,
+
+ xr = ggetr (gp, "xr")
+
+would assign the value of the parameter "xr" into the local variable of
+the same name.
+
+.nh 3
+STDGRAPH Graphcap Parameters
+
+ The \fBstdgraph\fR kernel is the "fast" kernel, i.e., the graphics kernel
+resident in the CL process. This kernel is capable of driving almost any
+modern graphics terminals given only a graphcap entry for the device,
+providing the graphics terminal is data driven and provides both character
+and vector generation in hardware.
+
+.nh 4
+Classes of Parameters
+
+ The stdgraph parameters fall into a number of classes which we shall
+describe separately. An alphabetical summary of all parameters is given in
+a later section.
+
+The open and close workstation sequences are sent to the device whenever the
+workstation is activated (OW) or deactivated (CW), e.g., when the STDGRAPH
+kernel receives the open workstation or close workstation directive, or when
+the open workstation is explicitly deactivated and later reactivated by the
+applications program.
+
+The primary function of the open and close workstation sequences is to
+effect a mode switch from text mode to graphics mode and back again,
+but the sequences may also contain instructions used only for initialization
+or mode setting. For example, OW might initialize user defined line types
+or enable the graphics board. The close string CW might disable the graphics
+board and set the alpha cursor to a standard place on the screen.
+
+The graphics enable and disable strings (GE,GD) are sent to the terminal
+by the STDGRAPH kernel when status line i/o occurs. The GD sequence should
+clear the status line, leaving the terminal in status line mode, with the
+text cursor positioned to the start of the status line. The GE sequence
+restores the terminal to graphics mode, and is often the same as the OW
+sequence. Note that GD should not cause the graphics frame to disappear,
+as the status line is supposed to be visible at the same time as the plot.
+
+The status line is normally the line at the bottom of the screen. On terminals
+with separate text and graphics memories which can both be displayed at the
+same time, the status line is normally written into the text memory. If the
+terminal has both text and graphics memories but can only display one at a time
+the graphics memory should be used, provided the status line can be erased in
+the graphics memory. If the graphics plane must be used but erase is not
+possible, the best approach is probably to write successive lines of status
+line text on top of the plot, starting at the upper left corner and advancing
+downward for each line of output text (see the 4012 entry in dev$graphcap).
+
+The parameters X1, X2, Y1, and Y2 define the range of device coordinates
+to be output. Normally these will span the full screen of the device,
+but in general they may define any rectangular window on the device screen.
+The fill area and font tables are array valued parameters mapping the GKI
+fill area and font indices into device codes (if the device should happen
+to support such niceties).
+
+
+.ks
+.nf
+ OW open (reactivate) workstation
+ IF initialization file, if OW string is large
+ CW close (deactivate) workstation
+ GE graphics enable (exit status line mode)
+ GD graphics disable (enter status line mode)
+ CL screen clear
+ LR load registers (see "binary encoding")
+
+ X1,X2 range of device X coordinates
+ Y1,Y2 range of device Y coordinates
+.fi
+.ke
+
+
+The set attribute parameters are format strings used to encode set attribute
+commands, each of which has a single integer argument. The format string is
+similar to a \fBprintf\fR format string with the addition of a notation for
+binary encoding (described below).
+
+
+.ks
+.nf
+ TH(i) set text height
+ TC(i) set text color
+ TF(i) set text font
+ LT(i) set line type
+ LC(i) set line color
+ LW(i) set line width
+ MC(i) set marker color
+ FT(i) set fill area type
+ FC(i) set fill area color
+.fi
+.ke
+
+
+Polyline generation, i.e., vector drawing, is more difficult to parameterize.
+We assume that polylines, polymarkers, fill areas, etc. are all similar enough
+to be described by the same coordinate encoding format, but we allow each
+such instruction to have different head and tail strings.
+
+.ks
+.nf
+ PL polyline flag
+ VS move start
+ VE move end
+ DS draw start
+ DE draw end
+ MS marker start
+ ME marker end
+ FS fillarea start
+ FE fillarea end
+ XY(i,j) coord format
+.fi
+.ke
+
+
+A polyline command consists of a number of subcommands, as outlined in the
+drawing below. The polyline is a move followed by one or more draws.
+The polyline flag PL is set to indicate that multiple coordinate pairs
+can be output between the DS and DE commands. If PL is false (or omitted)
+each coordinate pair in the GKI polyline will be output surrounded by DS
+and DE commands. The encoding of each coordinate pair is defined by the
+parameter XY.
+
+
+.ks
+.nf
+ set attributes if necessary
+ move start
+ x, y
+ move end
+ draw start
+ x, y
+ ...
+ x, y
+ draw end
+.fi
+.ke
+
+
+The polymarker and fillarea parameters are optional. The kernel will
+emulate markers and fill area if not supported by the hardware.
+Recall that GIO handles all mark drawing except GM_POINT (point mode),
+hence sophisticated mark drawing facilities are not required.
+
+Text generation is handled by the kernel a character at a time.
+If character up is 90 degrees and the path is to the right, the kernel
+will assume that it can output a number of characters between a TS
+and a TE. Otherwise each character will be output preceded by a TS
+and followed by a TE. The TS parameter is a format string with two
+arguments, the device coordinates of the lower left corner of the
+character to be drawn. The encoding of these coordinates is defined
+by the TS format string. It is possible to perform a coordinate
+transformation using the binary encoding facilities, if such is necessary.
+If characters are not addressed at the lower left corner an offset
+may be applied to the given coordinates using the binary encoding
+facilities.
+
+
+.ks
+.nf
+ TS(i,j) text start
+ TE text end
+.fi
+.ke
+
+
+Cursor output is controlled by the parameter WC.
+Cursor input is initiated by output of the sequence defined by the format RC.
+RC has one integer argument, the number of the cursor to be read.
+The UC capability, if defined, will cause the cursor position to be updated
+(with WC) to the position at the last cursor read. This is desirable if the
+device cannot maintain the cursor position, i.e., if unrelated graphics
+output commands affect the cursor position as an unwanted side effect.
+
+
+.ks
+.nf
+ UC update cursor pos before read
+ WC(x,y,i) write cursor
+ RC(i) read cursor start
+ RE read cursor end
+ CN cursor value length
+ CD cursor value delimiter
+ SC scan cursor (-> x,y,key)
+.fi
+.ke
+
+
+Following transmission of the RC sequence the kernel will read the
+response as defined by the parameters CN and CD. At least one of CN or CD
+must be given. If CN is given but not CD exactly CN characters will be
+read. If CD is given then characters will be read until the delimiter string
+is matched (and until at least CN characters have been read). If possible
+a delimiter string should be specified to permit recovery from bad cursor
+reads, e.g., when the user types something before the cursor is displayed.
+When a satisfactory cursor response string has been obtained the format SC
+will be used to decode the string into the output values X, Y, and KEY.
+The RE sequence is transmitted once the cursor read has successfully
+completed.
+
+.nh 4
+Binary Encoding
+
+ Graphics devices vary widely in the techniques used to encode numeric
+data such as a line type or color index, or the coordinate pairs of a
+polyline. Our approach to the encoding problem is a generalization of the
+\fBprintf\fR format string. The encoder is driven by a format string
+taken from the graphcap entry for the device. A number of standard formats
+are recognized with encoding provided internally for these standard formats
+by the encoder. To permit encoding of special formats the encoder provides
+a very general yet efficient RPN virtual machine capable of computing bit
+patterns according to a user supplied program embedded in the format string.
+
+A format string is a sequence of ASCII characters. Any ASCII character,
+including all control characters, is permitted in the string.
+The significance of a character depends on the context in which it appears.
+Initially characters are simply copied to the output. Three special
+characters are recognized in \fBcopy mode\fR (excluding the characters
+already counted as special by termcap):
+
+
+.ks
+.nf
+ ' escape next character (literal)
+ % begin a formatted output string
+ ( begin an executable expression
+.fi
+.ke
+
+
+The encoder is a table driven interpreter which is programmed by the format
+given in the graphcap file. Programming the encoder is rather
+like programming in assembler or microcode (its fun but easy to screw up).
+The encoder provides a set of 12 integer registers, an integer stack with a
+capacity of 50 values, and a dozen or so instructions. It is fundamentally
+assumed that the character set is ASCII (this is guaranteed by the IRAF
+programming environment).
+
+Upon entry one or more of the registers 1 through 3 are initialized to the
+values of the input arguments, leaving the remaining registers, i.e., R4-R9
+and R0 (R10) available for general use. Registers R11 and R12 are reserved
+for internal use.
+The interpreter is activated when an unescaped ( is encountered in the input.
+In \fBexecute mode\fR the following characters have special meanings
+(excluding :, ^, and \, which are special characters to termcap/TTY):
+
+.ks
+.nf
+ ' escape next character (recognized everywhere)
+ % conventional formatted output
+ ) revert to copy mode
+ #nnn push signed decimal integer number nnn
+ $ switch case construct
+ . pop number from stack and place in output string
+ , get next character from input string and push on stack
+ & modulus (similar to AND of low bits)
+ + add (similar to OR)
+ - subtract (similar to AND)
+ * multiply (shift left if pwr of 2)
+ / divide (shift right if pwr of 2)
+ < less than (0=false, 1=true)
+ > greater than (0=false, 1=true)
+ = equals (0=false, 1=true)
+ ; branch if: <bool> <offset> ;. The ; is at offset=0.
+ 0-9 push contents of register 0 through 9
+ !N pop stack into register N
+ !! generate a N millisecond delay, where N is on the stack
+.fi
+.ke
+
+
+Any other character encountered in execute mode is interpreted as an integer
+number and pushed on the stack. Hence, the character "@" is equivalent to
+"#64", i.e., octal 100. A blank is the integer constant 40B.
+
+The output format directive % will format and output the number on the top
+of the stack, popping the stack in the process. The format specification
+may be any legal \fBprintf\fR format. The case construct is used to process
+set attribute commands, e.g., set linetype 0, 1, 2, text size 1, 2, 3, etc,
+and also provides a rudimentary conditional processing capability. The branch
+if operator ; provides a rudimentary branching and looping capability.
+Beware that sequences like "^N" and "\E" compile as a single character in
+the format string.
+
+.nh 4
+Examples
+
+ As a simple example consider the encoding of the ANSI command to set
+the cursor of a nongraphics terminal. The required sequence is the
+following:
+
+ ESC [ line ; col H
+
+Assuming that the column number is designated as X and the line number as
+Y, in registers 1 and 2 respectively, the format would be as follows
+(the quotes are not part of the format):
+
+ "\E[(2)%d;(1)%dH"
+
+Now assume that the output sequence is the same but the line and column
+numbers are one-indexed while the terminal requires zero-indexed
+coordinates:
+
+ "\E[(2#1-)%d;(1#1-)%dH"
+
+Thus far the examples have been pretty trivial and do not warrant the
+complexity of the RPN interpreter proposed here. For our next example
+consider the encoding of a polyline coordinate pair for a Tektronix
+compatible graphics terminal and for an AED512, two quite different
+graphics terminals. The Tektronix format for encoding an (X,Y) coordinate
+pair is as follows:
+
+
+.ks
+.nf
+ 0 1 YA Y9 Y8 Y7 Y6
+ 1 1 Y5 Y4 Y3 Y2 Y1
+ 0 1 XA X9 X8 X7 X6
+ 1 0 X5 X4 X3 X2 X1
+.fi
+.ke
+
+
+Since the Tektronix device is so common the special format %t is provided
+for encoding register 1 and 2 (X and Y) in this format, and writing out
+the result. The format string
+
+ "%t"
+
+is all that is required. The more general solution is provided by the
+following format.
+
+ "(2 / +.2 &`+.1 / +.1 &@+."
+
+To understand this last example one must look up the octal values of
+the characters " " (40B), "`" (140B), and "@" (100B). The notation is
+admittedly rather cryptic but it is also concise and efficient, and works
+for a wide range of devices.
+
+Now consider the AED512 in binary mode (this is courtesy of NCAR; I do not
+have access to such a terminal). The output encoding of a coordinate pair
+is as follows:
+
+
+.ks
+.nf
+ XA X9 X8 YB YA Y9 Y8
+ X7 X6 X5 X4 X3 X2 X1
+ Y7 Y6 Y5 Y4 Y3 Y2 Y1
+.fi
+.ke
+
+
+The format required to generate this is shown below. Note the use of
+register 9 to store the constant 200B. The "^N" signifies <ctrl/n>,
+i.e., 16B, used to effect a left shift of four bits.
+
+ "(#128!919/^N*29/+.19&.29&."
+
+This format could be further optimized by preloading register 9 at
+\fBopenws\fR time by moving the "(#128!9" to parameter LR. The encoder
+registers maintain their values indefinitely. Using LR the two parameters
+might appear in the graphcap entry as follows.
+
+ ":LR=(#128!9:XY=(19/^N*29/+.19&.29&.:"
+
+The case construct makes it possible to generate output conditionally based
+on the value of an integer switch. The syntax of a case statement is as
+follows:
+
+ $1 ... $2-5 ... $6 ... $D ... $$
+
+When the first $ is encountered the switch value is popped off the stack
+and converted into a character by addition of the constant '0' (60B).
+The interpreter will then scan forward until it finds the indicated case,
+at which point it resumes execution in case mode. If the indicated case
+is not found scanning will stop at $D (the default case) or $$, whichever
+comes first. When the next $ is seen the interpreter skips forward until
+it finds $$, which marks the end of the case. Case constructs are not
+nestable.
+
+The case construct is used primarily for set attribute formats.
+For example, the GKI linetype codes are integers greater than or equal to zero,
+with case zero being the line clear and the other cases actual linetypes.
+For the VT640 there are nine possible linetypes, i.e., line clear,
+five builtin linetypes, and 3 user defined linetypes. The strings to be
+output for the cases 0 through 5 are the following:
+
+
+.ks
+.nf
+ linetype string
+
+ 0 ESC / 1 d ESC `
+ 1 ESC / 0 d ESC `
+ 2 ESC / 0 d ESC a
+ 3 ESC / 0 d ESC b
+ (etc) (etc)
+.fi
+.ke
+
+
+We could encode linetypes 0, 1 through 5, and everything else with the
+following format (linetype code in register 1):
+
+ "\E/(1$0)0d\E`($1-5)1d\E(1_+.$D)0d\E`($$"
+
+Note that case searching is a simple string matching operation that ignores
+operators such as ( and ). Only $, ' (escape), and EOS are recognized when
+searching for a case.
+
+.nh 4
+Efficiency
+
+ The interpreter approach to solving the general encoding problem
+presented here is not the only solution to the problem. Before adopting
+this approach several alternatives were considered. One such alternative
+was the bitfield packing and unpacking scheme used by NCAR to solve the
+same problem. The third alternative considered was to hand code a
+subroutine for each encoding required for each device. Benchmarks run
+to compare the three alternatives yielded the following times in
+cpu seconds required to plot a 1000 point array with Tektronix encoding:
+
+
+.ks
+.nf
+ bitfields approximately 30 seconds
+ interpreter 0.82 - 2.0 seconds
+ hand coded 0.78 seconds (mostly i/o)
+.fi
+.ke
+
+
+The time required for character output is included in the figures shown.
+The bitfields benchmark is an extrapolation from an actual timing of the
+prototype NCAR software as ported to the UNIX VAX by Cliff Stoll.
+The GBYTE and SBYTE primitives used to implement bitfields in the NCAR
+software were written in portable C by Cliff and did not use the VAX bitfield
+instructions, which would have helped significantly (but which would not
+have yielded a fair test: all IRAF target machines may not have bitfield
+instructions). The two timings shown for the interpreter are for the "%t"
+format and the general format. The clock time required by the hardware
+(VT100 with VT640 retrographics board) to draw the vectors was about 7 seconds.
+
+We conclude that the execution time overhead of the interpreter for encoding
+polyline points is acceptable and the use of hand coded, device dependent
+procedures is neither warranted nor desirable. The bitfields technique
+is too inefficient to use in a production interface.
+
+.nh 4
+Decoding Cursor Input
+
+ Decoding of the cursor value string returned by the device into
+X, Y, and KEY (keystroke) values is carried out using the table driven
+interpreter for decoding rather than for encoding. In this mode characters
+are input with "," and the decoded output values X, Y, and KEY are returned
+in registers 1 through 3. The % format encoding operator is not used.
+If the cursor value is returned in ASCII X and Y must be converted to
+binary the hard way (e.g., "ch1 '0' - 100 * ch2 '0' - 10 * +", etc.).
+
+To verify that this scheme will work consider the cursor value returned
+by a Tektronix compatible terminal. The return value is 6 characters,
+consisting of the character typed followed by the encoded X and Y in
+the next four characters, and lastly a CR terminator:
+
+
+.ks
+.nf
+ C7 C6 C5 C4 C3 C2 C1
+ 0 1 XA X9 X8 X7 X6
+ 0 1 X5 X4 X3 X2 X1
+ 0 1 YA Y9 Y8 Y7 Y6
+ 0 1 Y5 Y4 Y3 Y2 Y1
+ 0 0 0 1 1 0 1
+.fi
+.ke
+
+
+The required decoding format is shown below.
+
+ ",!3, & *, &+!1, & *, &+!2"
+
+.nh 4
+Summary of STDGRAPH Graphcap Parameters
+
+ An alphabetical summary of the graphcap parameters used by the STDGRAPH
+kernel is given below.
+
+
+.tp 3
+.nf
+ CD cursor value delimiter
+ CL screen clear
+ CN cursor response length
+ CW close (deactivate) workstation
+ DE draw end
+ DS draw start
+ FC(i) set fill area color
+ FE fillarea end
+ FS fillarea start
+ FT(i) set fill area type
+ GD graphics disable (exit status line mode)
+ GE graphics enable (enter status line mode)
+ IF initialization file, if OP string is large
+ LC(i) set line color
+ LR load registers
+ LT(i) set line type
+ LW(i) set line width
+ MC(i) set marker color
+ ME marker end
+ MS marker start
+ OW open (reactivate) workstation
+ PL polyline flag
+ RC(i) read cursor start
+ RE read cursor end
+ SC scan cursor (-> x,y,key)
+ TC(i) set text color
+ TE text end
+ TF(i) set text font
+ TH(i) set text height
+ TS(i,j) text start
+ VE move end
+ VS move start
+ WC(x,y,i) write cursor
+ X1 first device X coordinate
+ X2 last device X coordinate
+ XY(i,j) coordinate format
+ Y1 first device Y coordinate
+ Y2 last device Y coordinate
+.fi
+
+
+As a final example, the actual graphcap entry for the vt640 terminal
+(DEC VT100 with retrographics) is reproduced below.
+
+
+.ks
+.nf
+vt640|vt640g|vt100 with Retrographics:\
+ :RC=(1$2)^X\E[24;65H\E[7mLIGHT PEN READY\E[0m($$)^]\E"(1$2)5($D)4($$)g:\
+ :WC=^]%t\E/f:OW=150^]^_:CW=^X\E[24;0H\E[K:GE=150^]^_:GD=^X\E[24;0H\E[K:\
+ :lt#5:nc#2:se:CL=50^]\E^L:xr#640:yr#480:ar#.57:xs#.23:ys#.13:tc=4012:
+
+4012|tek4012|tektronix 4012:\
+ :ar#.70:ch#.0294:co#80:cw#.0125:in:k1#1:k2#127:kf=cl:li#35:\
+ :lt#5:nc#1:nk#127:pl:pm:th#4:t1#1:t2#2:t3#3:t4#4:tx:\
+ :wc:xr#1024:yr#780:xs#.20:ys#.14:\
+ :CD=^M:CN#6:LT=^]\E/(1$0)1d\E`($1-5)0d\E(1_+.$D)0d\E`($$:\
+ :MS=\034:PL:RC=\E^Z:SC=(,!3, & *, &+!1, & *, &+!2:\
+ :TH=\E(1#47+.:TS=^]%t^_:VS=^]:X1#0:X2#1023:XY=%t:Y1#0:Y2#779:\
+ :OW=^]^_:CW=(#682!2#0!1)^]%t^_:GE=^]^_:\
+ :CL=1000(#32!9)\E^L:\
+ :LR=(#32!9:GD=(9#1-!99$0#31!9$$9#22*!2#0!1)^]%t^_:
+.fi
+.ke
+
+.NH 3
+TERMCAP and GRAPHCAP
+
+ Every graphics terminal entry in the graphcap file should have a
+corresponding terminal capability entry in the termcap file. When the user
+sets the terminal type with the \fBstty\fR task in the CL, the termcap entry
+tells whether or not the terminal supports vector graphics, and the value
+of the \fBstdgraph\fR environment variable is set to "none" for a non-graphics
+terminal, or to the graphcap name of the device for a graphics terminal.
+For a terminal to be recognized by the system as a graphics terminal the
+termcap entry must include the ":gd" capability. If the graphcap name for
+the device is different than the termcap name then the form ":gd=gcname:"
+should be used.
+
+For example, the minimal termcap entry for the vt640 graphics terminal would
+be as follows. Note that it makes no sense to set the terminal type to
+"vt100", since a standard vt100 does not support vector graphics.
+
+.ks
+.nf
+ vt640|Retrographics enhanced VT100:\
+ :gd:tc=vt100:
+.fi
+.ke
+
+The "gd" capability is not standard termcap, but will be ignored by non-IRAF
+programs which do not recognize the capability.
+
+.nh 2
+Graphics Kernel Interface
+
+ The graphics kernel interface (GKI) is the interface between GIO and the
+underlying graphics kernel or kernels. The GKI is a data driven interface,
+i.e., GIO communicates with the graphics kernel via bidirectional streams
+of control instructions and data. The functionality assumed by the GKI is
+simple enough to permit use of a variety of graphics kernels, e.g., the builtin
+GIO kernel for interactive graphics terminals, GKS, CORE, NSPP, and so on.
+To understand the level of functionality expected from the kernel we first
+summarize the functions the kernel is \fInot\fR expected to perform, i.e.,
+the functions performed by GIO before output to the kernel:
+
+.ls 4
+.ls o
+All WCS coordinate transformations and clipping at the viewport boundary.
+The kernel sees only NDC coordinates.
+.le
+.ls o
+Axis drawing and labeling. GIO processes a \fBglabax\fR call into a
+sequence of polylines in NDC coordinates.
+.le
+.ls o
+Mark drawing. GIO processes all mark drawing commands into polyline
+instructions.
+.le
+.ls o
+Move and draw commands. GIO processes all absolute and relative move and draw
+commands into sequences of polyline instructions.
+.le
+.le
+
+
+The main functions of the kernel are the control and attribute set functions,
+set cursor, polyline, polymarker (GM_POINT only), text generation, fill area,
+cell array, and cursor read. A kernel need not implement all such functions,
+but it must at least recognize and ignore the corresponding GKI instructions.
+The GKI kernel instructions are easily implemented for modern intelligent
+graphics terminals. The fast kernel will let the terminal handle polyline
+drawing, point mode polymarker drawing, dashed lines, and character generation.
+
+The GKI format is a sequence of variable length binary control and
+output instructions. Each instruction consists of the beginning of instruction
+sentinel (BOI), an integer binary opcode identifying the instruction,
+an integer giving the length of the instruction in metacode words,
+and an arbitrary number of parameter and data words.
+The BOI word aids in the detection of and recovery from botched instructions,
+e.g., if an interrupt occurs while writing an instruction.
+
+
+.ks
+.nf
+ \fBfield\fR \fBdescription\fR
+
+ BOI beginning of instruction (magic value = 100000B)
+ opcode unique instruction identification code (1-27)
+ length length of entire of instruction in metacode
+ words (includes all four fields)
+ data variable length part of instruction
+.fi
+
+.ce
+Figure 3. GKI Instruction Format
+.ke
+
+
+The instruction format chosen for GKI is basically a direct mapping of the
+required low level functions into binary opcodes.
+Various standard formats were considered and rejected,
+in particular the GKS VDM (virtual device metafile) format.
+GKS VDM turned out to be far to complex to be worth using at this level
+in the system. The GKS VDI format might have been better suited,
+but I could not find any information describing this format
+(my understanding was that, although there are numerous implementations of VDI,
+there is no formal standard as yet).
+
+The GKI format may be extended at some point in the future to provide
+a binary instruction for each procedure in the GKS Fortran binding.
+This will make it possible for applications to use either GIO or GKS,
+provided a GKS kernel is available. This will make it easier to
+import applications which are already written to use GKS (alternatively a
+mini-GKS might be built upon GIO, since the primitive functions are almost
+identical). Since IRAF itself is transportable and it is desirable for IRAF
+applications to have full access to the IRAF i/o facilities, new IRAF
+applications are not being written with transport to another data reduction
+system in mind. New IRAF applications will use only GIO whenever the
+facilities provided by GIO are adequate. Applications which use only GIO
+will continue to be usable with any graphics kernel.
+
+.nh 3
+GKI Instructions
+
+ The GKI instruction stream transmitted between processes on the same or
+compatible machines will be a sequence of SPP short integer metacode words.
+The machine independent GKI metafile format will be the equivalent stream
+encoded as 16 bit twos complement signed integer metacode words, blocked
+1440 words per block, with conversion between the internal and external
+metacode formats being provided by the IRAF MII (machine independent integer)
+interface (MII takes care of byte swapping, etc.). GKI metafiles in MII
+format will be easily read and written by different machines, offloading most
+of the work to the graphics kernel on the reader machine. The GKI instruction
+format is designed for maximum efficiency on modern minicomputers, i.e.,
+the internal format (SPP short integer) is an atomic datatype and no bit
+operations are required to generate or interpret metacode.
+
+NDC coordinates (0.0 to 1.0) will be represented in GKI as integers in the
+range 0-32767. Character data will be packed one 7 bit ASCII character per
+metacode word. Floating point is required only for certain output attributes,
+e.g., the linewidth and character height (size) scale factors.
+To avoid the problems of machine dependent floating point formats we shall
+represent the low precision real numbers by converting them to integer
+metacode words scaled according to the following relation:
+
+ I = int (R * 1E2)
+
+Specifications for the GKI metafile instructions follow. The datatype and
+size of each field of the instruction is given in parenthesis.
+The datatype "p" denotes a coordinate pair (x,y) of type (m,m),
+where "m" denotes an NDC coordinate.
+
+The OPENWS instruction marks the start of an instruction stream or
+\fBmetafile\fR for a particular device.
+A subsequent CLOSEWS (or physical end of file) marks the end of a metafile.
+An OPENWS in APPEND mode requires that GIO recall the WCS defined when the
+device was last accessed.
+A physical file may consist of any number of independent metafiles.
+Although there is no explicit connection between OPENWS and screen clear
+(CLEARWS), a screen clear is implied for some devices when opened in
+new file mode.
+The MFTITLE instruction is optional and is provided only for documenting
+the contents of a metafile.
+
+
+.ks
+.nf
+ GKI_EOF = BOI 0 L
+ GKI_OPENWS = BOI 1 L M N D
+ GKI_CLOSEWS = BOI 2 L N D
+ GKI_REACTIVATEWS = BOI 3 L
+ GKI_DEACTIVATEWS = BOI 4 L
+ GKI_MFTITLE = BOI 5 L N T
+ GKI_CLEARWS = BOI 6 L
+ GKI_CANCEL = BOI 7 L
+ GKI_FLUSH = BOI 8 L
+ GKI_POLYLINE = BOI 9 L N P
+ GKI_POLYMARKER = BOI 10 L N P
+ GKI_TEXT = BOI 11 L P N T
+ GKI_FILLAREA = BOI 12 L N P
+ GKI_PUTCELLARRAY = BOI 13 L LL UR NC NL P
+ GKI_SETCURSOR = BOI 14 L CN POS
+ GKI_PLSET = BOI 15 L LT LW CI
+ GKI_PMSET = BOI 16 L MT MW CI
+ GKI_TXSET = BOI 17 L UP SZ SP P HJ VJ F Q CI
+ GKI_FASET = BOI 18 L FS CI
+ GKI_GETCURSOR = BOI 19 L CN
+ GKI_CURSORVALUE = BOI 19 L CN POS KEY
+ GKI_GETCELLARRAY = BOI 20 L LL UR NC NL
+ GKI_CELLARRAY = BOI 20 L NP P
+ GKI_ESCAPE = BOI 25 L FN N DC
+ GKI_SETWCS = BOI 26 L N WCS
+ GKI_GETWCS = BOI 27 L N
+.fi
+
+.ce
+The GKI Instruction Set
+.ke
+
+.nh 4
+Control Instructions
+
+ The NULL instruction is unique in that it consists of a single metacode
+word with value zero. The BOI and length fields are omitted. Any number
+of null words may be inserted between regular metacode instructions, e.g.,
+to pad a block of metacode to be written to an MII format metafile.
+The EOF instruction is used internally by GIO to stop metacode translation
+on a pseudofile stream, as if end of file had been encountered.
+
+The open workstation instruction should start a new frame unless the access
+mode is APPEND, in which case graphics is to be added to the last frame.
+An OPENWS implies an REACTIVATEWS. CLOSEWS does little more than deactivate
+the workstation, since the last frame must in some sense remain open for
+APPEND mode to be possible. Normal termination of the kernel process
+will or an open workstation in a mode other than append will cause the last
+frame to be terminated.
+
+
+.ls
+.tp 4
+GKI_EOF = BOI 0 L
+.ls
+.nf
+L(i) 3
+.fi
+.le
+
+
+.tp 6
+GKI_OPENWS = BOI 1 L M N D
+.ls
+.nf
+L(i) 5 + N
+M(i) access mode (APPEND=4, NEW_FILE=5, TEE=6)
+N(i) number of characters in field D
+D(Nc) device name as in \fBgraphcap\fR file
+.fi
+.le
+
+
+.tp 5
+GKI_CLOSEWS = BOI 2 L N D
+.ls
+.nf
+L(i) 4 + N
+N(i) number of characters in field D
+D(Nc) device name as in \fBgraphcap\fR file
+.fi
+.le
+
+
+.tp 5
+GKI_REACTIVATEWS = BOI 3 L
+.ls
+.nf
+L(i) 3
+.fi
+.le
+
+
+.tp 5
+GKI_DEACTIVATEWS = BOI 4 L
+.ls
+.nf
+L(i) 3
+.fi
+.le
+
+
+.tp 5
+.rj (optional)
+GKI_MFTITLE = BOI 5 L N T
+.ls
+.nf
+L(i) 4 + N
+N(i) number of characters in field T
+T(Nc) title string identifying metafile
+.fi
+.le
+
+
+.tp 3
+GKI_CLEARWS = BOI 6 L
+.ls
+.nf
+L(i) set to the constant 3 (no data fields)
+.fi
+.le
+
+
+.tp 3
+GKI_CANCEL = BOI 7 L
+.ls
+.nf
+L(i) set to the constant 3 (no data fields)
+.fi
+.le
+
+
+.tp 3
+GKI_FLUSH = BOI 8 L
+.ls
+.nf
+L(i) set to the constant 3 (no data fields)
+.fi
+.le
+.le
+
+.nh 4
+Output Instructions
+
+ All data points in the GKI output instructions have been transformed into
+NDC coordinates and clipped at the viewport boundary (if clipping is enabled).
+In the process GIO will translate any INDEF valued points by breaking large
+polylines into smaller polylines, hence the semantics of plotting polylines and
+polymarkers is quite simple at the graphics kernel level.
+
+CELLARRAY is processed into a series of one dimensional cell array instructions,
+one for each line in the two dimensional array supplied by the user. Fewer or
+shorter lines will be output if clipping is necessary. Arrays larger than 32767
+pixels may be output since each line is passed as a separate instruction.
+The maximum number of lines and columns in a cell array is 32767 and 32761,
+respectively (more lines can be input but they will not be resolved).
+The kernel is expected to scale cell arrays to fit the output device via some
+combination of pixel replication or subsampling, if there is not a one to one
+correspondence between cell array pixels and device pixels.
+
+.ls
+.tp 5
+GKI_POLYLINE = BOI 9 L N P
+.ls
+.nf
+L(i) 4 + N * 2
+N(i) number of points in the polyline
+P(Np) list of points (x,y pairs)
+.fi
+.le
+
+
+.tp 5
+GKI_POLYMARKER = BOI 10 L N P
+.ls
+.nf
+L(i) 4 + N * 2
+N(i) number of points in the polymarker
+P(Np) list of points (x,y pairs)
+.fi
+.le
+
+
+.tp 6
+GKI_TEXT = BOI 11 L P N T
+.ls
+.nf
+L(i) 6 + N
+P(p) starting point of character string
+N(i) number of characters in string T
+T(Nc) string of N ASCII characters
+.fi
+.le
+
+
+.tp 5
+GKI_FILLAREA = BOI 12 L N P
+.ls
+.nf
+L(i) 4 + (N * 2)
+N(i) number of points defining the polygon to be filled
+P(Np) list of points (x,y pairs)
+.fi
+.le
+
+
+.tp 8
+GKI_PUTCELLARRAY = BOI 13 L LL UR NC NL P
+.ls
+.nf
+L(i) 9 + (N * M)
+LL(p) coordinates of lower left corner of output area
+UR(p) coordinates of upper right corner of output area
+NC(i) number of columns in array
+NL(i) number of lines in array
+P(NCNLi) array of color indices (pixels) stored by row
+.fi
+.le
+
+
+.tp 5
+GKI_SETCURSOR = BOI 14 L CN POS
+.ls
+.nf
+L(i) 6
+CN(i) cursor number
+POS(p) new cursor position
+.fi
+.le
+.le
+
+.nh 4
+Set Attribute Instructions
+
+ The set polyline, polymarker, text, and fillarea instructions change
+the attributes used to generate graphics output. These instructions need be
+issued only when one of the attributes in an instruction packet changes, i.e.,
+the kernel is assumed to remember the attributes while a device is open.
+
+.ls
+.tp 6
+GKI_PLSET = BOI 15 L LT LW CI
+.ls
+.nf
+L(i) 6
+LT(i) linetype number
+LW(r) linewidth scale factor
+CI(i) polyline color index
+.fi
+.le
+
+
+.tp 6
+GKI_PMSET = BOI 16 L MT MW CI
+.ls
+.nf
+L(i) 6
+MT(i) marktype (not used at present)
+MW(i) marksize, NDC coords (not used at present)
+CI(i) marker color index
+.fi
+.le
+
+
+.tp 9
+GKI_TXSET = BOI 17 L UP SZ SP P HJ VJ F Q CI
+.ls
+.nf
+L(i) 12
+UP(i) character up vector (degrees)
+SZ(r) character size scale factor
+SP(r) character spacing
+P(i) path (0,2=left,3=right,4=up,5=down)
+HJ(i) horizontal justification
+ (0=normal,1=center,2=left,3=right)
+VJ(i) vertical justification
+ (0=normal,1=center,6=top,7=bottom)
+F(i) font (8=roman,9=greek,10=italic,11=bold)
+Q(i) quality (0=normal,12=low,13=medium,14=high)
+CI(i) text color index
+.fi
+.le
+
+
+.tp 5
+GKI_FASET = BOI 18 L FS CI
+.ls
+.nf
+L(i) 5
+FS(i) fill style (0=clear,1=hollow,2=solid,3-6=hatch)
+CI(i) fill area color index
+.fi
+.le
+.le
+
+
+The attributes for the output primitives are assumed to be set to their
+default values when OPENWS is issued.
+
+.nh 4
+Input Instructions
+
+ The primary input instruction is the cursor read instruction, used to read
+the cursor position in NDC coordinates. The device cursor read may be either
+event driven or instantaneous. If the cursor read is event driven a nonzero
+keystroke value may be returned, the range of possible keystroke values being
+device dependent. The instantaneous type of cursor read is preferred at the
+GKI level since it offers the maximum flexibility (\fBclgcur\fR may then be
+used to provide an optional device independent keystroke driven cursor read).
+Devices which support both forms of cursor read may provide both as separate
+logical cursors. The graphics kernel should return a null cursor value if
+the output device does not have a cursor.
+
+.ls
+.tp 6
+GKI_GETCURSOR = BOI 19 L CN
+.ls
+.nf
+L(i) 4
+CN(i) cursor number
+.fi
+
+The kernel reads graphics cursor number CN and returns the keystroke value
+(if any) and the cursor position in NDC coordinates. The cursor attributes
+are returned in the following format:
+
+ GKI_CURSORVALUE = BOI 19 L CN POS KEY
+
+where
+
+.nf
+ L(i) 7
+ CN(i) cursor number
+ POS(r) NDC coordinates of cursor
+ KEY(i) keystroke value (>= 0 or EOF)
+.fi
+.le
+
+
+.tp 8
+GKI_GETCELLARRAY = BOI 20 L LL UR NC NL
+.ls
+.nf
+L(i) 9
+LL(p) coordinates of lower left corner of input area
+UR(p) coordinates of upper right corner of input area
+NC(i) number of columns in output array
+NL(i) number of lines in output array
+.fi
+
+The GETCELLARRAY instruction is the converse of the PUTCELLARRAY instruction.
+The cell array is returned in the following format:
+
+ GKI_CELLARRAY = BOI 20 L NP P
+
+where
+
+.nf
+ L(i) 4 + NP
+ NP(i) number of pixels (0 if noread)
+ P(NPi) array of pixels
+.fi
+.le
+
+
+(instruction codes 19-24 are reserved for future use)
+.le
+
+.nh 4
+Escape Instruction
+
+ The escape instruction is used to pass device dependent information or
+commands to the graphics kernel via GKI. The graphics kernel will ignore
+unrecognized escape functions. Function codes 1 through 100 are reserved
+for use by GIO.
+
+.ls
+.tp 5
+GKI_ESCAPE = BOI 25 L FN N DC
+.ls
+.nf
+L(i) 5 + N
+FN(i) escape function code
+N(i) number of escape data words
+DC(i) escape data words
+.fi
+.le
+.le
+
+.nh 4
+Pseudo-GKI Instructions
+
+ Since the CL must be able to read the device cursor and convert NDC
+coordinates to WCS coordinates, the WCS must be passed to the CL when they
+are "fixed" to the device. The most natural and efficient way to do this
+is via the GKI instruction stream, hence several additional instructions
+are used internally in GIO to communicate with the portion of GIO resident
+in the CL process. These instructions are filtered out and executed by the
+CL process and their existence may therefore be ignored by the graphics kernels.
+
+The SETWCS instruction is used to pass WCS information to the CL process.
+The GETWCS instruction is used to recall the WCS for a device opened in APPEND
+mode (the WCS are returned in SETWCS format). Since these instructions
+are passed only between two closely coupled processes on a single cpu,
+floating point numbers are passed in machine dependent format.
+The length of this instruction is machine dependent.
+Only the fields L and WCS are truely part of the instruction; the remaining
+fields are a binary copy of the GIO internal WCS structure.
+
+.ls
+.tp 6
+GKI_SETWCS = BOI 26 L N WCS
+.ls
+.nf
+L(i) 4 + 17 * sizeof (struct wcs)
+N(i) length of WCS structure, words
+WCS binary copy of the 17 WCS structures, transmitted
+ in a single call to WRITE
+.fi
+.le
+
+
+.tp 5
+GKI_GETWCS = BOI 27 L N
+.ls
+.nf
+L(i) 4
+N(i) maximum number of words to read
+.fi
+.le
+.le
+
+.nh 3
+Encoding GKI Instructions
+
+ The GKI instruction opcodes and fields are defined in the global include
+file lib$gki.h. To avoid direct knowledge of the binary format of the GKI
+instructions, GIO uses a subpackage called GKI to encode the GKI instructions.
+The GKI procedures each encode and transmit a single GKI instruction on the
+output stream. Although the GIO and GKI procedures have similar names, they
+should not be confused. The GIO \fBgpline\fR, for example, performs conversion
+from a WCS to GKI coordinates with clipping at the viewport boundary, checking
+that the polyline attributes are up to date before transmitting the polyline
+instruction. In contrast the GKI \fBgki_polyline\fR merely encodes and
+transmits the GKI_POLYLINE metacode instruction.
+
+The GKI procedures are self contained with the exception of the set attribute
+instructions, which reference attribute packet structures (argument \fIap\fR)
+defined in the include file gio.h.
+The GKI instruction encoding procedures are shown below.
+
+.ks
+.nf
+ gki_openws (fd, device, mode)
+ gki_closews (fd, device)
+ gki_reactivatews (fd, flags)
+ gki_deactivatews (fd, flags)
+ gki_mftitle (fd, title)
+ gki_clearws (fd)
+ gki_cancel (fd)
+ gki_flush (fd)
+ gki_polyline (fd, points, npts)
+ gki_polymarker (fd, points, npts)
+ gki_text (fd, x, y, text)
+ gki_fillarea (fd, points, npts)
+ gki_getcellarray (fd, m, nx, ny, x1,y1, x2,y2)
+ gki_putcellarray (fd, m, nx, ny, x1,y1, x2,y2)
+ gki_plset (fd, ap)
+ gki_pmset (fd, ap)
+ gki_txset (fd, ap)
+ gki_faset (fd, ap)
+ gki_setcursor (fd, x, y, cursor)
+ gki_getcursor (fd, x, y, key, cursor)
+ gki_escape (fd, fn, instruction, nwords)
+ gki_setwcs (fd, wcsdata, len_wcsdata)
+ gki_getwcs (fd, wcsdata, len_wcsdata)
+
+ gki_fflush (fd) # not GKI instruction; flushes GKI stream
+.fi
+.ke
+
+
+.nh 3
+Decoding GKI Instructions
+
+ The following additional procedures are provided for decoding and executing
+GKI metacode, e.g., in a graphics kernel. In what follows, \fIinstruction\fR
+is a short integer array containing the encoded GKI instruction, and \fIdd\fR
+is the device driver table, i.e., array of \fBzlocpr\fR entry point addresses
+of the standard kernel procedures.
+
+
+.ks
+.nf
+ stat = gki_fetch_next_instruction (fd, instruction_ptr)
+ gki_execute (instruction, dd)
+ gkp_install (dd, out_fd, verbose_output)
+.fi
+.ke
+
+
+The \fBfetch\fR procedure extracts the next instruction from the input metacode
+stream, returning a short integer pointer to the instruction as an output
+argument. EOF is returned as the function value when end of file is detected.
+The \fBexecute\fR procedure decodes an instruction and calls a graphics device
+driver procedure to execute the instruction. If the entry point address
+of the driver procedure is NULL \fBgki_execute\fR will ignore the corresponding
+GKI instruction. The fields of the metacode instruction are passed to the
+driver procedure as distinct arguments, hence the device driver need not
+understand the GKI format.
+
+A standard kernel is provided for decoding GKI instructions, printing the
+decoded instructions in text form on the output stream. The driver for this
+kernel is installed with \fBgkp_install\fR, setting the output file and
+verbose output flag in the process.
+
+.nh 3
+Example
+
+ To illustrate the use of GKI as well as the output of the GKI decoding
+kernel, consider the simple \fBgplotv\fR style plot of the following function:
+
+ y = x ** 2
+
+over the range
+
+ x = 1 to 5, y = 1 to 25
+
+The decoded GKI metacode produced by GIO to graph this function is
+shown below. The "verbose" mode of output (shown) lists the values
+of the data points in the polyline, etc. output functions. If verbose
+output is disabled only the statistics of the output polylines
+(computed by the decoder) will be printed. All coordinates are printed
+in NDC units. The redundant points appearing in the output metacode
+are expected to be filtered out by the kernel, which should not plot
+points separated by less than the device resolution in NDC units.
+
+
+.tp 4
+.nf
+open_workstation 'vt640', mode=new_file
+set_wcs nwords=352
+ 1 1. 5. 1. 25. 0.19 0.81 0.33 0.96 0 0 1
+set_polyline ltype=1, lwidth=2.00, color=1
+polyline np=3, xmin=0.19,xmax=0.19,xavg=0.19, ymin=0.33,ymax=0.37,yavg=0.34
+ 0.188 0.334 0.188 0.334 0.188 0.367
+set_text up=90, path=right, hjustify=center, vjustify=top, font=roman,
+ size=1.00, spacing=0.00, color=1, quality=normal
+text 0.19, 0.31, '1'
+polyline np=15, xmin=0.19,xmax=0.34,xavg=0.27, ymin=0.33,ymax=0.37,yavg=0.34
+ 0.188 0.334 0.219 0.334 0.219 0.350 0.219 0.334 0.250 0.334
+ 0.250 0.350 0.250 0.334 0.281 0.334 0.281 0.350 0.281 0.334
+ 0.313 0.334 0.313 0.350 0.313 0.334 0.344 0.334 0.344 0.367
+text 0.34, 0.31, '2'
+polyline np=15, xmin=0.34,xmax=0.50,xavg=0.43, ymin=0.33,ymax=0.37,yavg=0.34
+ 0.344 0.334 0.375 0.334 0.375 0.350 0.375 0.334 0.406 0.334
+ 0.406 0.350 0.406 0.334 0.437 0.334 0.437 0.350 0.437 0.334
+ 0.469 0.334 0.469 0.350 0.469 0.334 0.500 0.334 0.500 0.367
+text 0.50, 0.31, '3'
+polyline np=15, xmin=0.50,xmax=0.66,xavg=0.58, ymin=0.33,ymax=0.37,yavg=0.34
+ 0.500 0.334 0.531 0.334 0.531 0.350 0.531 0.334 0.562 0.334
+ 0.562 0.350 0.562 0.334 0.593 0.334 0.593 0.350 0.593 0.334
+ 0.625 0.334 0.625 0.350 0.625 0.334 0.656 0.334 0.656 0.367
+text 0.66, 0.31, '4'
+polyline np=15, xmin=0.66,xmax=0.81,xavg=0.74, ymin=0.33,ymax=0.37,yavg=0.34
+ 0.656 0.334 0.687 0.334 0.687 0.350 0.687 0.334 0.718 0.334
+ 0.718 0.350 0.718 0.334 0.750 0.334 0.750 0.350 0.750 0.334
+ 0.781 0.334 0.781 0.350 0.781 0.334 0.812 0.334 0.812 0.367
+text 0.81, 0.31, '5'
+polyline np=2, xmin=0.81,xmax=0.81,xavg=0.81, ymin=0.33,ymax=0.33,yavg=0.33
+ 0.812 0.334 0.812 0.334
+polyline np=77, xmin=0.78,xmax=0.81,xavg=0.81, ymin=0.33,ymax=0.96,yavg=0.65
+ 0.812 0.334 0.812 0.334 0.796 0.334 0.812 0.334 0.812 0.360
+ 0.796 0.360 0.812 0.360 0.812 0.386 0.796 0.386 0.812 0.386
+ 0.812 0.412 0.796 0.412 0.812 0.412 0.812 0.438 0.779 0.438
+ 0.812 0.438 0.812 0.464 0.795 0.464 0.812 0.464 0.812 0.490
+ 0.795 0.490 0.812 0.490 0.812 0.516 0.795 0.516 0.812 0.516
+ 0.812 0.542 0.795 0.542 0.812 0.542 0.812 0.568 0.779 0.568
+ 0.812 0.568 0.812 0.594 0.795 0.594 0.812 0.594 0.812 0.620
+ 0.795 0.620 0.812 0.620 0.812 0.646 0.795 0.646 0.812 0.646
+ 0.812 0.672 0.795 0.672 0.812 0.672 0.812 0.698 0.779 0.698
+ 0.812 0.698 0.812 0.724 0.795 0.724 0.812 0.724 0.812 0.750
+ 0.795 0.750 0.812 0.750 0.812 0.776 0.795 0.776 0.812 0.776
+ 0.812 0.802 0.795 0.802 0.812 0.802 0.812 0.828 0.778 0.828
+ 0.812 0.828 0.812 0.854 0.795 0.854 0.812 0.854 0.812 0.880
+ 0.795 0.880 0.812 0.880 0.812 0.906 0.795 0.906 0.812 0.906
+ 0.812 0.932 0.795 0.932 0.812 0.932 0.812 0.958 0.778 0.958
+ 0.812 0.958 0.812 0.958
+polyline np=15, xmin=0.19,xmax=0.22,xavg=0.19, ymin=0.33,ymax=0.44,yavg=0.38
+ 0.188 0.334 0.188 0.334 0.204 0.334 0.188 0.334 0.188 0.360
+ 0.204 0.360 0.188 0.360 0.188 0.386 0.204 0.386 0.188 0.386
+ 0.188 0.412 0.204 0.412 0.188 0.412 0.188 0.438 0.221 0.438
+set_text up=90, path=right, hjustify=right, vjustify=center, font=roman,
+ size=1.00, spacing=0.00, color=1, quality=normal
+text 0.19, 0.44, '5'
+polyline np=15, xmin=0.19,xmax=0.22,xavg=0.19, ymin=0.44,ymax=0.57,yavg=0.51
+ 0.188 0.438 0.188 0.464 0.204 0.464 0.188 0.464 0.188 0.490
+ 0.204 0.490 0.188 0.490 0.188 0.516 0.204 0.516 0.188 0.516
+ 0.188 0.542 0.204 0.542 0.188 0.542 0.188 0.568 0.221 0.568
+text 0.19, 0.57, '10'
+polyline np=15, xmin=0.19,xmax=0.22,xavg=0.19, ymin=0.57,ymax=0.70,yavg=0.64
+ 0.188 0.568 0.188 0.594 0.204 0.594 0.188 0.594 0.188 0.620
+ 0.204 0.620 0.188 0.620 0.188 0.646 0.204 0.646 0.188 0.646
+ 0.188 0.672 0.204 0.672 0.188 0.672 0.188 0.698 0.221 0.698
+text 0.19, 0.70, '15'
+polyline np=15, xmin=0.19,xmax=0.22,xavg=0.19, ymin=0.70,ymax=0.83,yavg=0.77
+ 0.188 0.698 0.188 0.724 0.204 0.724 0.188 0.724 0.188 0.750
+ 0.204 0.750 0.188 0.750 0.188 0.776 0.204 0.776 0.188 0.776
+ 0.188 0.802 0.204 0.802 0.188 0.802 0.188 0.828 0.221 0.828
+text 0.19, 0.83, '20'
+polyline np=15, xmin=0.19,xmax=0.22,xavg=0.19, ymin=0.83,ymax=0.96,yavg=0.90
+ 0.188 0.828 0.188 0.854 0.204 0.854 0.188 0.854 0.188 0.880
+ 0.204 0.880 0.188 0.880 0.188 0.906 0.204 0.906 0.188 0.906
+ 0.188 0.932 0.204 0.932 0.188 0.932 0.188 0.958 0.221 0.958
+text 0.19, 0.96, '25'
+polyline np=2, xmin=0.19,xmax=0.19,xavg=0.19, ymin=0.96,ymax=0.96,yavg=0.96
+ 0.188 0.958 0.188 0.958
+polyline np=65, xmin=0.19,xmax=0.81,xavg=0.50, ymin=0.92,ymax=0.96,yavg=0.95
+ 0.188 0.958 0.188 0.958 0.188 0.925 0.188 0.958 0.219 0.958
+ 0.219 0.942 0.219 0.958 0.250 0.958 0.250 0.942 0.250 0.958
+ 0.281 0.958 0.281 0.941 0.281 0.958 0.313 0.958 0.313 0.941
+ 0.313 0.958 0.344 0.958 0.344 0.925 0.344 0.958 0.375 0.958
+ 0.375 0.941 0.375 0.958 0.406 0.958 0.406 0.941 0.406 0.958
+ 0.437 0.958 0.437 0.941 0.437 0.958 0.469 0.958 0.469 0.941
+ 0.469 0.958 0.500 0.958 0.500 0.925 0.500 0.958 0.531 0.958
+ 0.531 0.941 0.531 0.958 0.562 0.958 0.562 0.941 0.562 0.958
+ 0.593 0.958 0.593 0.941 0.593 0.958 0.625 0.958 0.625 0.941
+ 0.625 0.958 0.656 0.958 0.656 0.924 0.656 0.958 0.687 0.958
+ 0.687 0.941 0.687 0.958 0.718 0.958 0.718 0.941 0.718 0.958
+ 0.750 0.958 0.750 0.941 0.750 0.958 0.781 0.958 0.781 0.941
+ 0.781 0.958 0.812 0.958 0.812 0.924 0.812 0.958 0.812 0.958
+set_text up=90, path=right, hjustify=center, vjustify=bottom, font=roman,
+ size=1.00, spacing=0.00, color=1, quality=normal
+text 0.50, 0.96, 'title'
+set_polyline ltype=1, lwidth=1.00, color=1
+polyline np=5, xmin=0.19,xmax=0.69,xavg=0.44, ymin=0.33,ymax=0.96,yavg=0.59
+ 0.188 0.334 0.313 0.412 0.438 0.542 0.562 0.724 0.687 0.958
+flush
+close_workstation 'vt640'
+.fi
+
+
+.nh 2
+Graphics Kernel Parameters
+
+ The translation from GKI codes to device codes should ideally be
+parameterized to permit variable device resolution, font substitution,
+and so on at translation time. In general this is best handled by
+spooling the metacode and later processing it via an explicit call to
+a metacode translator program, using CL parameters to control the translation.
+Some control over translation may also be achieved by modifying the
+\fBgraphcap\fR entry for a device, provided the graphics kernel uses
+the graphics capability database.
+
+One of the most useful translation time parameters is the device resolution.
+On some devices, e.g. pen plotters, it is necessary to be able to change
+the device resolution at translation time to permit plotting of large vectors
+without loss of resolution. Changing the device resolution is also a valuable
+technique for speeding up graphics when working remotely via a modem.
+
+.nh
+GKS Emulation
+
+ The basic graphics primitives provided by GIO (polyline, polymarker, etc.)
+are functionally identical to those provided by GKS (the Graphics Kernel
+System). The basic drawing primitives of GKS are therefore easily emulated
+using GIO. A subset of the Fortran binding of GKS has already been emulated,
+sufficient to run the NCAR utilities recently converted by NCAR for use with
+GKS. In principle it should be possible to expand the GKS emulation to a
+full level 0b or 1b interface, although we have no plans to do so at present.