## NAME

          pslib v3.2 - A PostScript based plotting library

## DESCRIPTION

          pslib was created to make the generation of PostScript page
          description code easier.  It is a library that contains a series of
          tools that can be used to create plots.  The resulting PostScript code
          is ASCII text and can be edited using any text editor.  Thus, it is
          fairly easy to modify a plot file even after it has been created,
          e.g., to change text strings, set new gray shades or colors,
          experiment with various penwidths etc.  pslib is written in C but now
          includes FORTRAN bindings (thanks to John Goff, WHOI) and can
          therefore be called from both C and FORTRAN programs.  To use this
          library, you must link your plotting program with pslib.a.  pslib is
          the core of the GMT SYSTEM and XY graphics programs.  pslib output
          conforms to the Adobe Encapsulated PostScript File Specification
          Version 3.0 (EPSL), and may be used as EPS files and inserted into,
          say, a Word document on a Mac.  See Appendix F in the Technical
          Reference for detailed instructions.  Before any pslib calls can be
          issued, the plotting system must be initialized.  This is done by
          calling ps_plotinit, which defines macros, sets up the plot-coordinate
          system, scales, and [optionally] opens a file where all the PostScript
          code will be written.  Normally, the plot code is written to stdout.
          The measure unit for sizes and positions can be set to be centimeter,
          inch, or m.  When all plotting is done, you must terminate the
          plotting system by calling ps_plotend.  pslib uses the direct color
          model where red, green, and blue are given separately, each must be in
          the range from 0-255.  If red < 0 then no fill operation takes place.
          Most plot-items can be plotted with or without outlines.  If outline
          is desired (i.e., set to 1), it will be drawn using the current
          linewidth and pattern. pslib uses highly optimized macro substitutions
          and scales the coordinates depending on the resolution of the hardcopy
          device so that the output file is kept as compact as possible.  A wide
          variety of output devices that support PostScript exist, including
          laserwriters (color or monochrome) and workstations running PostScript
          based window systems like SUNs OpenWindows.  xnews (part of
          OpenWindows) or ghostscript (public domain) can be used to create
          rasterfiles at a user-defined resolution (DPI), making it possible to
          render PostScript on a Versatec and other non-PostScript raster
          devices.  Regular SUN rasterfiles created under NeWS from PostScript
          files can be sent to a variety of color hardcopy units.  Check the
          devices available on your network.

## FUNCTION CALLS

          The following is a list of available functions and a short description
          of what they do and what parameters they expect.  All floating point
          variables are expected to be double (i.e., 8 bytes), whereas all
          integers are assumed to be 4 bytes long.  All plotting functions are
          declared as functions returning an int.  Currently, the return value
          is undefined.

               void ps_arc (x, y, radius, angle1, angle2, status)
               double x, y, radius, angle1, angle2;
               int status;
                    Draws a circular arc centered on (x,y) from angle angle1 to
                    angle2.  Angles must be given in decimal degrees.  If angle1
                    > angle2, a negative arc is drawn.  status is a value from 0
                    through 3.  1 means set new anchor point, 2 means stroke the
                    circle, 3 means both, 0 means none of the above.

               void ps_axis (xpos, ypos, length, startval, stopval, tickval,
               label, anotpointsize, side)
               double xpos, ypos, length, startval, stopval, tickval;
               int anotpointsize, side;
               char *label;
                    Plots an axis with tickmarks, annotation, and label.  xpos,
                    ypos, and length are in inches (or cm or meters),
                    anotpointsize in points (72 points = 1 inch), else data
                    units are used.  side can be 0, 1, 2, or 3, which selects
                    lower x-axis, right y-axis, upper x-axis, or left y-axis,
                    respectively.  labelpointsize = 1.5 * anotpointsize.  A
                    negative tickval will reverse the sense of positive
                    direction, e.g., to have the y-axis be positive down.

               void ps_circle (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a circle and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.

               void ps_clipoff ()
                    Resets the clip path to what it was before the last call to
                    clipon.

               void ps_clipon (xarray, yarray, npoints, rgb, flag)
               double xarray[], yarray[];
               int npoints, rgb[3], flag;
                    Sets up a user-definable clip path.  Plotting outside this
                    polygon will be clipped until ps_clipoff is called.  If red
                    >= 0 the inside of the path is filled with the specified
                    color.  flag is used to create complex clip paths consisting
                    of several disconnected regions, and takes on values 0-3.
                    flag = 1 means this is the first path in a multi-segment
                    clip path.  flag = 2 means this is the last segment.  Thus,
                    for a single path, flag = 3.

               void ps_colorimage (xpos, ypos, xlength, ylength, buffer, nx, ny)
               double xpos, ypos, xlength, ylength;
               unsigned char buffer[];
               int nx, ny;
                    Plots a 24-bit true color image using rgb colors.  Similar
                    to ps_image except bits is fixed to be 8.  The rgb triplets
                    are stored in buffer as rgbrgbrgb...  This functions sets up
                    a call to the PostScript colorimage operator which is not
                    implemented in all drivers.

               void ps_colortiles (x0, y0, xlength, ylength, buffer, nx, ny)
               double x0, y0, xlength, ylength;
               int nx, ny;
               unsigned char buffer[];
                    Plots a true color image based on individual color tiles.
                    x0, y0 is the location of the lower left corner of the image
                    in inches.  xlength, ylength is the image size in inches.
                    buffer contains rgb triplets stored as rgbrgbrgb... nx, ny
                    is the image size in pixels.

               void ps_command (text)
               char *text;
                    Writes a raw PostScript command to the PostScript output
                    file, e.g. "1 setlinejoin".

               void ps_comment (text)
               char *text;
                    Writes a comment (text) to the PostScript output file, e.g.
                    "Start of graph 2".

               void ps_cross (xcenter, ycenter, diameter)
               double xcenter, ycenter, diameter;
                    Plots a cross at the specified point using current pen-width
                    and -pattern that fits inside a circle of given diameter.

               void ps_diamond (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a diamond and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.  The symbol will fit inside a circle of
                    given diameter.

               void ps_ellipse (xcenter, ycenter, angle, major, minor, rgb,
               outline)
               double xcenter, ycenter, angle, major, minor;
               int rgb[3], outline;
                    Plots a ellipse with its major semiaxis rotated by angle
                    degrees and fills it with the specified color.  If outline
                    == 1, the outline will be drawn using current pen-width and
                    -pattern.

               void ps_flush ()
                    Flushes the output buffer.

               void ps_hexagon (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a hexagon and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.  The symbol will fit inside a circle of
                    given diameter.

               void ps_image (xpos, ypos, xlength, ylength, buffer, nx, ny,
               bits)
               double xpos, ypos, xlength, ylength;
               unsigned char buffer[];
               int nx, ny, bits;
                    Plots a bit-mapped image using grayshades.  Specify position
                    of lower left corner and size (in inches) of image.  buffer
                    is an unsigned character array with gray shade values (0 -
                    255) where 0 is black, 255 is white.  bits is number of bits
                    pr pixel (8, 4,  or 1). nx,ny refers to the number of pixels
                    in image.  The rowlength of buffer must be an integral
                    number of 8/bits.  buffer[0] is upper left corner.  E.g. if
                    bits = 4, then buffer[j]/16 gives shade for pixel[2j-1] and
                    buffer[j]%16 (mod 16) gives shade for pixel[2j].  buffer
                    values are stored as columns, starting at the lower left
                    corner and ending at the upper right corner.  See the Adobe
                    Systems PostScript Reference Manual for more details.

               void ps_imagefill (x, y, n, image, imagefile, invert, imagedpi,
               outline, template, r_rgb, b_rgb)
               double x[], y[], x0, y0;
               int n, image, invert, imagedpi, outline, template, f_rgb[3],
               b_rgb[3];
               char imagefile;
                    Similar to ps_polygon, but fills the area with an image
                    pattern rather than a color or grayshade.  x and y hold the
                    arrays of n points.  90 predefined patterns are available
                    (See GMT Appendix E).  image gives the image number (1-90).
                    If set to 0, imagefile must be the name to the user's image,
                    which must be stored as a SUN 1-, 8-, or 24-bit rasterfile.
                    1-bit images only: (i) If invert is TRUE (1), the black and
                    white pixels are interchanged before plotting.  (ii) If
                    template is TRUE (1), the set pixels are colored using the
                    RGB combination in f_rgb, while the unset are painted with
                    b_rgb.  The unit size of the image is controlled by
                    imagedpi.  If set to zero, the image is plotted at the
                    device resolution.  If outline is TRUE, the current penwidth
                    is used to draw the polygon outline.

               void ps_imagemask (xpos, ypos, xlength, ylength, buffer, nx, ny,
               polarity, rgb)
               double xpos, ypos, xlength, ylength;
               unsigned char buffer[];
               int nx, ny, polarity, rgb[3];
                    Plots a transparent 1-bit image mask using the given rgb
                    color.  Specify position of lower left corner and size (in
                    inches) of image.  buffer is an unsigned character array
                    with 8 pixels per byte.  nx,ny refers to the number of
                    pixels in image.  The rowlength of buffer must be an
                    integral number of 8.  buffer[0] is upper left corner.
                    buffer values are stored as columns, starting at the lower
                    left corner and ending at the upper right corner.  If
                    polarity is 0 then the bits that are 0 are painted with the
                    rgb color, else the bits that are 1 are colored.  See the
                    Adobe Systems PostScript Reference Manual for more details.

               void ps_itriangle (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots an inverted and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.  The symbol will fit inside a circle of
                    given diameter.

               void ps_line (xarray, yarray, npoints, type, close, split)
               double xarray[], yarray[];
               int npoints, type, close, split;
                    Draw a continuous line from the positions in the x-y arrays.
                    If close == 1, the first and last point will automatically
                    be closed by the PostScript driver.  If this is the first
                    segment in a multi-segment path, set type == 1.  To end the
                    segments and have the line(s) drawn,  set type == 2.  Thus,
                    for a single segment, type must be 3.  The line is drawn
                    using the current penwidth.  Only if split is TRUE may
                    ps_line use multiple strokes to draw lines longer that
                    MAX_PATH.  ps_polygon will call ps_line with split = FALSE
                    since the path must be continuous.  If split is FALSE and
                    the pathlength exceeds MAX_PATH a warning will be issued.

               unsigned char *ps_loadraster (fp, header, invert, monochrome,
               template, f_rgb, b_rgb)
               FILE *fp;
               struct rasterfile *header;
               BOOLEAN invert, monochrome, template;
               int f_rgb[], b_rgb[];
                    Reads the image contents of the Sun rasterfile pointed to by
                    the open filepointer fp.  The header must first be obtained
                    with ps_read_rasheader.  If invert is TRUE then 1-bit images
                    will be bit-reversed.  If monochrome is TRUE then color
                    images are converted to grayimages using the TV YIQ
                    translation.  If template is TRUE then 1-bit images will be
                    colorized using the for- and background colors provided in
                    f_rgb and b_rgb.  The routine can handle 1-, 8-, 24-, or
                    32-bit files in old, standard, run-length encoded, or RGB-
                    style Sun format.

               void ps_patch (xarray, yarray, npoints, rgb, outline)
               double xarray[], yarray[];
               int npoints, rgb[3], outline;
                    Identical to ps_polygon except polygon must be < 20 points
                    long and there will be no attempt to shorten the path by
                    discarding unnecessary intermediate points along straight
                    segments.  Primarily used when painting large number of
                    small polygons and not waste output space.

               void ps_pie (xcenter, ycenter, radius, azimuth1, azimuth2, rgb,
               outline)
               double xcenter, ycenter, radius, azimuth1, azimuth2;
               int rgb[3], outline;
                    Plots a sector of a circle and paints it with the specified
                    RGB combination.  If outline == 1, the outline will be drawn
                    using current pen-width and -pattern.

               void ps_plot (xabs, yabs, kpen)
               double xabs, yabs;
               int kpen;
                    Absolute move (kpen=3) or draw (kpen=2), using current
                    linewidth.

               void ps_plotend (last_page)
               int last_page;
                    Terminates the plotting sequence and closes plot file (if
                    other than stdout). If last_page == 1, then a PostScript
                    showpage command is issued, which initiates the printing
                    process on hardcopy devices.

               void ps_plotinit (plotfile, overlay, mode, xoff, yoff, xscl,
               yscl, ncopies, dpi, unit, pagesize, rgb, eps)
               char *plotfile;
               int overlay, mode, ncopies, dpi, unit;
               double xoff, yoff, xscl, yscl;
               int pagesize[2], rgb[3]; struct EPS * eps;
                    Initializes the plotting.  If plotfile == NULL (or ""), then
                    output is sent to stdout, else output is sent to plotfile.
                    overlay should be 1 only if you plan to append it to some
                    existing PostScript file.  mode contains three flags in the
                    three lowest bits.  The lowest bit controls the plot
                    orientation and can be 0 (Landscape) or 1 (Portrait).  The
                    next bit, if set to 1, will re-encode the fonts to include
                    European accented characters.  The third bit controls the
                    format used to write PostScript images: 0 means binary, 1
                    means hexadecimal.  Most printers needs the latter while
                    some can handle binary which are 50% smaller and therefore
                    execute faster.  xoff,yoff are used to move the origin from
                    the default position in the lower left corner.  xscl,yscl
                    are used to scale the entire plot (Usually set to 1.0, 1.0).
                    Set ncopies to get more than 1 copy.  dpi sets the hardcopy
                    resolution in dots pr units.  For optimum plot quality and
                    processing speed, choose dpi to match the intended plotter
                    resolution.  Examples are 300 for most laserwriters, 2540
                    for Linotype-300, and ~85 for SUN screens.  When in doubt,
                    use 300.  unit can be any of 0 (CM), 1 (INCH), or 2 (M),
                    telling the plot system what units are used for distance and
                    sizes.  Note that, regardless of choice of unit, dpi is
                    still in dots-pr-inch.  pagesize means the physical width
                    and height of the plotting media in points, (typically 612
                    by 792 for Letter or 595 by 842 for A4 laserwriter plotters.
                    The rgb array holds the color of the page (usually white =
                    255,255,255).  The EPS structure is defined in the pslib.h
                    include file and contains information that will make up the
                    comments header of a EPS file.  Programmers who plan to call
                    pslib routines should read the comments in pslib.h first.
                    Note that the FORTRAN binding does not expect this last
                    argument.

               void ps_plotr (xrel, yrel, kpen)
               double xrel, yrel;
               int kpen;
                    Move (kpen = 3) or draw (kpen = 2) relative to current point
                    (see ps_plot).

               void ps_polygon (xarray, yarray, npoints, rgb, outline)
               double xarray[], yarray[];
               int npoints, rgb[3], outline;
                    Creates a colored polygon from the positions in the x-y
                    arrays.  Polygon will automatically be closed by the
                    PostScript driver.  If outline == 0, no outline is drawn.
                    If outline == 1, the outline is drawn using current
                    penwidth.

               int ps_read_rasheader (fp, header)
               FILE *fp;
               struct rasterfile *header;
                    Using the pointer fp to the open file, return the header
                    structure of the Sun rasterfile.  This call is portable as
                    it operates on the byte level.  Once the header is returned
                    you may obtain the raster image with ps_loadraster.

               void ps_rect (x1, y1, x2, y2, rgb, outline)
               double x1, y1, x2, y2;
               int red, green, blue, outline;
                    Plots a colored rectangle. (x1,y1) and (x2,y2) are any two
                    corners on a diagonal.  If outline == 1, the outline will be
                    drawn using current pen-width and -pattern.

               void ps_rotatetrans (x, y, angle)
               double x, y, angle;
                    Rotates the coordinate system by angle degrees, then
                    translates origin to (x,y).

               void ps_setdash (pattern, offset)
               char *pattern;
               int offset;
                    Changes the current dashpattern.  The character string
                    pattern is set to the desired pattern.  E.g., "4 2" and
                    offset = 1 will plot like:
                         x ----  ----  ----
                    etc, where x is starting point (The x is not plotted).  That
                    is, the line is made up of a repeating pattern of a 4 units
                    long line and a 2 unit long gap, starting 1 unit after the
                    x.  To reset to solid line, specify pattern = NULL ("") and
                    offset = 0.  Units are in dpi units.

               void ps_setfont (fontnr)
               int fontnr;
                    Changes the current font number to fontnr.  The fonts
                    available are:  0 = Helvetica, 1 = H. Bold, 2 = H. Oblique,
                    3 = H. Bold-Oblique, 4 = Times, 5 = T. Bold, 6 = T. Italic,
                    7 = T. Bold Italic, 8 = Courier, 9 = C. Bold, 10 = C
                    Oblique, 11 = C Bold Oblique, 12 = Symbol, 13 = AvantGarde-
                    Book, 14 = A.-BookOblique, 15 = A.-Demi, 16 = A.-
                    DemiOblique, 17 = Bookman-Demi, 18 = B.-DemiItalic, 19 =
                    B.-Light, 20 = B.-LightItalic, 21 = Helvetica-Narrow, 22 =
                    H-N-Bold, 23 = H-N-Oblique, 24 = H-N-BoldOblique, 25 =
                    NewCenturySchlbk-Roman, 26 = N.-Italic, 27 = N.-Bold, 28 =
                    N.-BoldItalic, 29 = Palatino-Roman, 30 = P.-Italic, 31 =
                    P.-Bold, 32 = P.-BoldItalic, 33 = ZapfChancery-MediumItalic.
                    If fontnr is outside this range, it is set to 0.

               void ps_setformat (n_decimals)
               int n_decimals;
                    Sets number of decimals to be used when writing color or
                    gray values.  The default setting of 3 gives 1000 choices
                    per red, green, and blue value, which is more than the 255
                    choices offered by most 24-bit platforms.  Choosing a lower
                    value will make the output file smaller at the expense of
                    less color resolution.  Still, a value of 2 gives 100 x 100
                    x 100 = 1 million colors, more than most eyes can
                    distinguish.  For a setting of 1, you will have 10 nuances
                    per primary color and a total of 1000 unique combinations.

               void ps_setline (linewidth)
               int linewidth;
                    Changes the current linewidth in DPI units.  0 gives
                    thinnest line, but the use of 0 is implementation-dependent
                    (Works fine on most laserwriters).

               void ps_setpaint (rgb)
               int rgb[3];
                    Changes the current RGB setting for pens and text.

               void ps_square (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a square and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.  The symbol will fit inside a circle of
                    given diameter.

               void ps_star (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a star and fills it with the specified color.  If
                    outline == 1, the outline will be drawn using current pen-
                    width and -pattern.  The symbol will fit inside a circle of
                    given diameter.

               void ps_text (x, y, pointsize, text, angle, justify, form)
               double x, y, angle;
               char *text;
               int pointsize, justify, form;
                    The text is plotted starting at (x,y), and will make an
                    angle with the horizontal.  The point (x,y) maps onto
                    different points of the textstring by giving various values
                    for justify.  It is used as follows:
                              9------------10----------- 11
                               |                             |
                              5             6             7
                               |                             |
                              1------------ 2------------ 3
                    The box represents the textstring.  E.g., to plot a
                    textstring with its center of gravity at (x,y), you must use
                    justify == 6.  If justify is negative, then all leading and
                    trailing blanks are stripped before plotting.  Certain
                    character sequences (flags) have special meaning to ps_text.
                    @~ toggles between current font and the Mathematical Symbols
                    font.  @%no% sets font to no; @%% resets to starting font.
                    @- turns subscript on/off, @+ turns superscript on/off, @#
                    turns small caps on/off, and @\ will make a composite
                    character of the following two character.  Give fontsize in
                    points (72 points = 1 inch).  Normally, the text is typed
                    using solid characters.  To draw outline characters, set
                    form == 1.

               void ps_textbox (x, y, pointsize, text, angle, justify, outline,
               dx, dy, rgb)
               double x, y, angle, dx, dy;
               char *text;
               int pointsize, justify, outline, rgb[3];
                    This function is used in conjugation with ps_text when a box
                    surrounding the text string is desired.  Taking most of the
                    arguments of ps_text, the user must also specify the color
                    of the resulting rectangle, and whether its outline should
                    be drawn.  More room between text and rectangle can be
                    obtained by setting dx and dy accordingly.

               void ps_transrotate (x, y, angle)
               double x, y, angle;
                    Translates the origin to (x,y), then rotates the coordinate
                    system by angle degrees.

               void ps_triangle (xcenter, ycenter, diameter, rgb, outline)
               double xcenter, ycenter, diameter;
               int rgb[3], outline;
                    Plots a triangle and paints it with the specified RGB
                    combination.  If outline == 1, the outline will be drawn
                    using current pen-width and -pattern.  The symbol will fit
                    inside a circle of given diameter.

               void ps_vector (xtail, ytail, xtip, ytip, tailwidth, headlength,
               headwidth, headshape, rgb, outline)
               double xtail, ytail, xtip, ytip, tailwidth, headlength,
               headwidth, headshape;
               int rgb[3], outline;
                    Draws a vector of size and appearance as specified by the
                    various parameters.  headshape can take on values from 0-1
                    and specifies how far the intersection point between the
                    base of a straight vector head and the vector line is moved
                    toward the tip.  0 gives a triangular head, 1.0 gives an
                    arrow shaped head. If outline == 1, the outline will be
                    drawn using current penwidth.

               void ps_words (x, y, text, n_words, line_space, par_width,
               par_just, font, font_size, angle, rgb, justify, draw_box, x_off,
               y_off, x_gap, y_gap, boxpen_width, boxpen_texture, boxpen_offset,
               boxpen_rgb, vecpen_width, vecpen_texture, vecpen_offset,
               vecpen_rgb, boxfill_rgb)
               double x, y, line_space, par_width, angle, x_off, y_off, x_gap,
               y_gap;
               int n_words, font, font_size, justify, draw_box, boxpen_width,
               boxpen_offset;
               int boxpen_rgb[3], vecpen_width, vecpen_offset, vecpen_rgb[3],
               boxfill_rgb[3];
               char **text, *boxpen_texture, *vecpen_texture;
                    Typesets paragraphs of text.  text is an array of the words
                    to typeset, using the given line-spacing and paragraph
                    width.  The whole text block is positioned at x, y which is
                    the anchor point on the box as indicated by justify (see
                    ps_text). The whole block is then shifted by x_off, y_off.
                    Inside the box, text is justified left, centered, right, or
                    justified as governed by par_just (lcrj).  draw_box contains
                    4 bit flags pertaining to the surrounding outline box.  If
                    on, the first (lowest) bit draws the box outline.  The
                    second bit fills the box interior.  The third bit makes the
                    outline box have rounded corners (unless x_gap, y_gap, which
                    specifies the padding between the text and the box, are
                    zero), while the forth bit draws a line from the original x,
                    y point to the shifted position.  The escape sequences
                    described for ps_text applies here, as well as two
                    additional commands: @;r/g/b; changes the font color (@;;
                    resets it), and @:size: changes the font size (@:: resets
                    it).

## AUTHOR

          Paul Wessel, School of Ocean and Earth Science and Technology, 1680
          East-West Road, Honolulu, Hawaii 96822, (808) 956-4778, Internet
          address: wessel@soest.hawaii.edu.

## BUGS

          Caveat Emptor:  The author is not responsible for any disasters,
          suicide attempts, or ulcers caused by correct or incorrect use of
          pslib.  If you find bugs, please report them to the author by
          electronic mail.  Be sure to provide enough detail so that I can
          recreate the problem.

## RESTRICTIONS

          Due to the finite memory of some output devices like Laserwriters,
          certain restrictions due to limitations of the PostScript interpreter
          apply:  For now, the arrays passed to ps_clipon and ps_polygon must
          contain less than about 1350 points.  Also, the buffer array passed to
          ps_image must be able to fit in the available memory.  Check the
          specifications of the hardcopy device you are using.  Note that some
          Raster Image Processors (RIPs) do not support direct color so that the
          colors you get may not be exactly the ones you wanted.  This is a
          limitation of the RIP, not the underlying PostScript code generated by
          pslib.

## REFERENCES

          Adobe Systems Inc., 1990, PostScript language reference manual, 2nd
          edition, Addison-Wesley, (ISBN 0-201-18127-4).