Provided by: gmt-common_5.4.3+dfsg-1_all bug

NAME

       postscriptlight - A PostScript based plotting library

DESCRIPTION

       PSL  (PostScriptLight)  was  created to make the generation of PostScript page description
       code easier. PS is a page description language developed by the Adobe for specifying how a
       printer  should  render a page of text or graphics. It uses a reverse Polish notation that
       puts and gets items from a stack to draws  lines,  text,  and  images  and  even  performs
       calculations. PSL is a self-contained library that presents a series of functions that can
       be used to create plots. The resulting PostScript code is ASCII text (with some exceptions
       for  images  if  so  desired)  and  can  thus be edited using any text editor. Thus, it is
       possible 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  pen widths, etc.
       Furthermore, various tools exist that can parse PostScript and let you make such edits via
       a  graphical  user  interface  (e.g., Adobe Illustrator). PSL is written in C but includes
       FORTRAN bindings and can therefore be called from both C and  FORTRAN  programs.   To  use
       this  library,  you  must  link  your  plotting  program with PSL.  PSL is used by the GMT
       graphics programs to generate PS. PSL output is freeform PostScript that conforms  to  the
       Adobe PostScript File Specification Version 3.0.

       Before  any PSL calls can be issued, the plotting system must be initialized. This is done
       by  calling  PSL_beginsession,  which  initializes  a   new   PSL   session;   then   call
       PSL_setdefaults  which  sets internal variables and default settings, accepts settings for
       measurement units and character encoding, and returns a pointer to a struct PSL_CTRL which
       must  be  passed  as first argument to all other PSL functions. The measure unit for sizes
       and positions can be set to be centimeter (c), inch (i), meter (m), or points (p).  A  PSL
       session  is  terminated by calling PSL_endsession. You may create one or more plots within
       the same session. A new plot is started by calling PSL_beginplot,  which  defines  macros,
       sets up the plot-coordinate system, scales, and [optionally] opens a file where all the PS
       code will be written.  Normally, the plot code is written to stdout. When all plotting  to
       this file is done, you finalize the plot by calling PSL_endplot.

       A  wide  variety  of output devices that support PostScript exist, including many printers
       and large-format plotters. Many tools exists to display PostScript on a  computer  screen.
       Open source tools such as ghostscript can be used to convert PostScript into PDF or raster
       images (e.g., TIFF, JPEG) at a user-defined resolution (DPI). In particular, the GMT  tool
       psconvert  is  a  front-end  to  ghostscript  and  pre-selects  the  optimal  options  for
       ghostscript that will render quality PDF and images.

       The PSL is fully 64-bit compliant. Integer parameters are here specified by the type  long
       to  distinguish them from the 32-bit int. Note that under standard 32-bit compilation they
       are equivalent. Users of this library under 64-bit mode must make sure  they  pass  proper
       long variables (under Unix flavors) or __int64 under Windows 64.

UNITS

       PSL  can be instructed to use centimeters, inches, meters or points as input units for the
       coordinates and sizes of elements to be plotted.  Any dimension that takes this setting as
       a  unit  is  specified  as user units or plot units in this manual. Excluded from this are
       line widths and font sizes which are always measured in points.  The  user  units  can  be
       further  refined  by calling PSL_beginaxes, giving the user the opportunity to specify any
       linear coordinate frame. Changing the coordinate frame only  affects  the  coordinates  of
       plotted  material  indicated  as  measured  in plot units, not the sizes of symbols (which
       remain in user units), nor line widths or font sizes (which remain in points).

COLOR

       PSL uses the direct color model where red, green, and blue are given separately, each must
       be  in  the  range  from 0-1. If red = -1 then no fill operation takes place. If red = -3,
       then pattern fill will be used, and the green value will indicate the pattern to be  used.
       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  line  width  and  pattern.   PSL  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.

JUSTIFICATION

       Text strings, text boxes and images can be “justified” by specifying the corner  to  which
       the  x and y coordinates of the subroutine call apply. Nine different values are possible,
       as shown schematically in this diagram:
          9————10———– 11

          |                         |

          5             6             7

          |                          |

          1———— 2———— 3

       The box represents the text or image. E.g., to plot a text string with its center  at  (x,
       y),  you  must  use  justify  == 6. justify == 0 means “no justification”, which generally
       means (x, y) is at the bottom left. Convenience values PSL_NONE, PSL_BL,  PSL_BC,  PSL_BL,
       PSL_ML, PSL_MC, PSL_MR, PSL_TL, PSL_TC and PSL_TR are available.

INITIALIZATION

       These  functions  initialize  or  terminate the PSL system. We use the term PSL session to
       indicate one instance of the PSL system (a complicated program could run many PSL sessions
       concurrently  as  each  would  operate  via  its  own  control structure). During a single
       session,  one  or  more  plots  may  be  created.  Here  are  the  functions  involved  in
       initialization:

       struct PSL_CTRL *New_PSL_Ctrl (char *session)
          This  is  the  first  function  that  must  be  called as it creates a new PSL session.
          Specifically, it will allocate a new PSL control structure and initialize  the  session
          default  parameters.  The pointer that is returned must be passed to all subsequent PSL
          functions.

       long *PSL_beginsession (struct PSL_CTRL *PSL, long search, char *sharedir, char *userdir)
          This is the second function that must be called as it initializes the new PSL  session.
          Here,  search is an integer that is passed as 0 in GMT but should be 1 for other users.
          If so we will search for the  environmental  parameters  PSL_SHAREDIR  and  PSL_USERDIR
          should the corresponding arguments sharedir and userdir be NULL.

       long PSL_endsession (struct PSL_CTRL *PSL)
          This  function terminates the active PSL session; it is the last function you must call
          in your program. Specifically, this function will deallocate memory used  and  free  up
          resources.

       struct PSL_CTRL *PSL_beginlayer (struct PSL_CTRL *PSL, long layer)
          Adds  a  DSC comment by naming this layer; give a unique integer value. Terminate layer
          with PSL_endlayer

       struct PSL_CTRL *PSL_endlayer (struct PSL_CTRL *PSL)
          Terminate current layer with a DSC comment.

       long PSL_fopen (char *file, char *mode)
          This function simply opens a file, just like fopen. The reason it is replicated here is
          that  under  Windows,  file  pointers  must be assigned within the same DLL as they are
          being used. Yes, this is retarded but if we do not do so then PSL will  not  work  well
          under Windows. Under non-Windows this functions is just a macro that becomes fopen.

       void PSL_free (void *ptr)
          This function frees up the memory allocated inside PSL.  Programmers using C/C++ should
          now this is a macro and there is no need to cast the pointer to void * as this will  be
          done by the macro. Fortran programmers should instead call PSL_freefunction.

       void  PSL_beginaxes  (struct  PSL_CTRL  *PSL, double llx, double lly, double width, double
       height, double x0, double y0, double x1, double y1)
          This function sets up the mapping that takes the users data  coordinates  and  converts
          them  to  the  positions  on  the  plot  in  PostScript units. This should be used when
          plotting data coordinates and is terminated with PSL_endaxes, which returns PSL to  the
          default  measurement  units and scaling. Here, llx and lly sets the lower left position
          of the mapping region, while width and height sets the dimension of the  plot  area  in
          user  units.  Finally,  x0,  x1  and  y0,  y1  indicate  the  range of the users x- and
          y-coordinates, respectively. Specify a reverse axis direction (e.g., to let the  y-axis
          be  positive  down)  by  setting  y0  larger  than y1, and similarly for an x-axis that
          increases to the left.

       void PSL_endaxes (struct PSL_CTRL *PSL)
          Terminates the map scalings initialized by PSL_beginaxes and returns  PSL  to  standard
          scaling in measurement units.

       long  PSL_beginplot  (struct  PSL_CTRL  *P, FILE *fp, long orientation, long overlay, long
       color_mode,  char  origin[],  double  offset[],  double  page_size[],  char  *title,  long
       font_no[])
          Controls  the  initiation  (or  continuation)  of  a particular plot within the current
          session. Pass file pointer fp where the PostScript code will be written; if  NULL  then
          the  output is written to stdout. The Fortran interface always sends to stdout.  If you
          want to receive the PostScript back in memory  then  you  need  to  add  PSL_MEMORY  to
          orientation  and  call  PSL_getplot to retrieve the plot after you finish the plot with
          PSL_endplot.  The orientation  may  be  landscape  (PSL_LANDSCAPE  or  0)  or  portrait
          (PSL_PORTRAIT  or  1).  Set overlay to PSL_OVERLAY (0) if the following PostScript code
          should be appended to an existing plot; otherwise pass PSL_INIT  (1)  to  start  a  new
          plot.   Let colormode be one of PSL_RGB (0), PSL_CMYK (1), PSL_HSV (2) or PSL_GRAY (3);
          this setting controls how colors are presented  in  the  PostScript  code.  The  origin
          setting  determines  for  x  and y separately the origin of the specified offsets (next
          argument). Each of the two characters are either  r  for  an  offset  relative  to  the
          current  origin,  a  for  a  temporary  adjustment of the origin which is undone during
          BD(PSL_endplot), f for a placement of the origin relative to the lower left  corner  of
          the page, c for a placement of the origin relative to the center of the page. The array
          offset specifies the offset of the new origin relative to  the  position  indicated  by
          origin.   page_size means the physical width and height of the plotting media in points
          (typically 612 by 792 for Letter or 595 by 842 for A4  format).  The  character  string
          title  can  be  used to specify the %%Title: header in the PostScript file (or use NULL
          for the default). The array font_no specifies all fonts used in the plot  (by  number),
          or use NULL to leave out the %%DocumentNeededResources: comment in the PostScript file.

       long PSL_endplot (struct PSL_CTRL *P, long last_page)
          Terminates  the  plotting  sequence  and  closes  plot  file (if other than stdout). If
          last_page == PSL_FINALIZE (1), then a PostScript  showpage  command  is  issued,  which
          initiates the printing process on hardcopy devices.  Otherwise, pass PSL_OVERLAY (0).

       long PSL_setorigin (struct PSL_CTRL *P, double xorigin, double yorigin, double angle, long
       mode)
          Changes the coordinate  system  by  translating  by  (xorigin,yorigin)  followed  by  a
          angle-degree  rotation  (mode=PSL_FWD  or  0) or alternatively the rotation followed by
          translation (mode=PSL_INV or 1).

MEMORY OUTPUT

       Normally,  PSL  will  write  all  PostScript  to  the  designated  file  stream   set   in
       PSL_beginplot.   Alternatively,  PSL  can  write  all the PostScript to an internal char *
       buffer which can be retrieved at the end of the plotting.  This mode can be enabled  on  a
       plot-by-plot  basis  by  adding  the flag PSL_MEMORY to the variable orientation passed to
       PSL_beginplot.  Once we reach the end of the plot with  PSL_endplot  the  buffer  will  be
       available (see below).  One function provide the functionality for memory output.

       char * PSL_getplot (struct PSL_CTRL *P)
          Retrieves  the pointer to the PostScript plot that is kept in memory when PSL_beginplot
          was instructed to use memory rather than stream output.  Note: It is the responsibility
          of  the  programmer  to  ensure  that  the object retrieved is duplicated or written or
          otherwise processed before the next call to PSL_beginplot or PSL_endsession  either  of
          which will destroy the memory pointed to.

CHANGING SETTINGS

       The  following  functions  are  used to change various PSL settings and affect the current
       state of parameters such as line and fill attributes.

       long PSL_define_pen (struct PSL_CTRL *P, char  *name,  long  width,  char  *style,  double
       offset, double rgb[])
          Stores the specified pen characteristics in a PostScript variable called name. This can
          be used to place certain pen attributes in the PostScript file and then  retrieve  them
          later with PSL_load_pen. This makes the stored pen the current pen.

       long PSL_define_rgb (struct PSL_CTRL *P, char *name, double rgb[])
          Stores  the  specified color in a PostScript variable called name.  This can be used to
          place certain color values in the PostScript file and then  retrieve  them  later  with
          PSL_load_rgb. This makes the stored color the current color.

       long PSL_setcolor (struct PSL_CTRL *P, double rgb[], long mode)
          Sets  the  current  color  for all stroked (mode = PSL_IS_STROKE (0)) or filled (mode =
          PSL_IS_FILL (1)) material to follow (lines, symbol outlines, text). rgb is a triplet of
          red,  green and blue values in the range 0.0 through 1.0. Set the red color to -3.0 and
          the green color to the pattern number returned by PSL_setpattern to select a pattern as
          current paint color. For PDF transparency, set rgb[3] to a value between 0 (opaque) and
          1 (fully transparent).

       long PSL_setpattern (struct PSL_CTRL *P, long image_no, char *imagefile, long dpi,  double
       f_rgb[], double b_rgb[])
          Sets  up the specified image pattern as the fill to use for polygons and symbols. Here,
          image_no is the number of the standard PSL fill patterns (1-90; use a  negative  number
          when  you  specify an image filename instead. The scaling (i.e., resolution in dots per
          inch) of the pattern is controlled by the image dpi; if set to 0 it will be plotted  at
          the  device  resolution.  The two remaining settings apply to 1-bit images only and are
          otherwise ignored: You may replace the foreground color (the set bits) with  the  f_rgb
          color and the background color (the unset bits) with b_rgb.  Alternatively, pass either
          color with the red component set to -1.0 and we will instead issue an image  mask  that
          is see-through for the specified fore- or background component. To subsequently use the
          pattern as a pen or fill color, use PSL_setcolor or DB(PSL_setfill) with  the  a  color
          rgb code made up of r = -3, and b = the pattern number returned by PSL_setpattern.

       long PSL_setdash (struct PSL_CTRL *P, char *pattern, double offset)
          Changes  the  current  pen  style attributes. The character string pattern contains the
          desired pattern using a series of lengths in points specifying the alternating  lengths
          of dashes and gaps in points. E.g., “4 2” and offset = 1 will plot like
              x —- —- —-

          where  x  is starting point of a line (The x is not plotted). That is, the line is made
          up of a repeating pattern of a 4 points long solid  line  and  a  2  points  long  gap,
          starting  1  point after the x. To reset to solid line, specify pattern = NULL (“”) and
          offset = 0.

       long PSL_setfill (struct PSL_CTRL *P, double rgb[], long outline)
          Sets the current fill color and whether or not outline is needed for  symbols.  Special
          cases  are  handled by passing the red color as -1.0 (no fill), -2.0 (do not change the
          outline setting) or -3.0 (select the image pattern  indicated  by  the  second  (green)
          element  of rgb).  For PDF transparency, set rgb[3] to a value between 0 (opaque) and 1
          (fully transparent). Set outline to PSL_OUTLINE (1) to draw the  outlines  of  polygons
          and symbols using the current pen.

       long PSL_setfont (struct PSL_CTRL *P, long 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,   34   =   ZapfDingbats,   35  =  Ryumin-Light-EUC-H,  36  =
          Ryumin-Light-EUC-V, 37 = GothicBBB-Medium-EUC-H, and 38  =  GothicBBB-Medium-EUC-V.  If
          fontnr is outside this range, it is reset to 0.

       long  PSL_setfontdims (struct PSL_CTRL *P, double supsub, double scaps, double sup, double
       sdown)
          Changes the settings for a variety of relative font  sizes  and  shifts  pertaining  to
          sub-scripts,  super-scripts,  and  small caps.  Default settings are given in brackets.
          Here, supsub sets the relative size of sub- and super-scripts [0.58],  scaps  sets  the
          relative  size  of  small  caps  [0.8],  sup  indicates  the  upward baseline shift for
          placement of super-scripts [0.33], while sdown sets the  downward  baseline  shift  for
          sub-scripts [0.33].

       long PSL_setformat (struct PSL_CTRL *P, long n_decimals)
          Sets  the  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.

       long PSL_setlinewidth (struct PSL_CTRL *P, double linewidth)
          Changes  the  current  line  width  in  points.  Specifying  0  gives the thinnest line
          possible, but this is implementation-dependent (seems to work fine on  most  PostScript
          printers).

       long PSL_setlinecap (struct PSL_CTRL *P, long cap)
          Changes  the  current  line  cap, i.e., what happens at the beginning and end of a line
          segment. PSL_BUTT_CAP (0) gives butt line caps  [Default],  PSL_ROUND_CAP  (1)  selects
          round caps, while PSL_SQUARE_CAP (2) results in square caps. Thus, the two last options
          will visually lengthen a straight line-segment by half the line width at either end.

       long PSL_setlinejoin (struct PSL_CTRL *P, long join)
          Changes the current linejoin setting, which handles how lines of finite  thickness  are
          joined  together  when the meet at different angles. PSL_MITER_JOIN (0) gives a mitered
          joint [Default], PSL_ROUND_JOIN (1) makes them round, while PSL_BEVEL_JOIN (2) produces
          bevel joins.

       long PSL_setmiterlimit (struct PSL_CTRL *P, long limit)
          Changes  the  current miter limit used for mitered joins.  PSL_MITER_DEFAULT (35) gives
          the default PS miter; other values are  interpreted  as  the  cutoff  acute  angle  (in
          degrees) when mitering becomes active.

       long PSL_settransparencymode (struct PSL_CTRL *P, char *mode)
          Changes  the  current PDF transparency rendering mode [Default is Normal]. Choose among
          Color, ColorBurn, ColorDodge, Darken, Difference, Exclusion, HardLight,  Hue,  Lighten,
          Luminosity, Multiply, Normal, Overlay, Saturation, SoftLight, and Screen.

       long  PSL_setdefaults  (struct  PSL_CTRL  *P,  double  xyscales[],  double pagergb[], char
       *encoding)
          Allows changes to the PSL session settings  and  should  be  called  immediately  after
          PSL_beginsession.  The  xyscales  array  affect  an  overall magnification of your plot
          [1,1]. This can be useful if you design a  page-sized  plot  but  would  then  like  to
          magnify  (or shrink) it by a given factor. Change the default paper media color [white;
          1/1/1] by specifying an alternate page color. Passing zero (or NULL for  pagergb)  will
          leave  the  setting unchanged. Finally, pass the name of the character set encoding (if
          NULL we select Standard).

       long PSL_defunits (struct PSL_CTRL *P, char *name, double value)
          Creates a PostScript variable called name and initializes it to the equivalent of value
          user units.

       long PSL_defpoints (struct PSL_CTRL *P, char *name, double fontsize)
          Creates  a  PostScript  variable  called  name  and  initializes  it  to the value that
          corresponds to the font size (in points) given by fontsize.

PLOTTING LINES AND POLYGONS

       Here are functions used to plot lines and closed polygons, which may optionally be filled.
       The  attributes used for drawing and filling are set prior to calling these functions; see
       CHANGING SETTINGS above.

       long PSL_plotarc (struct PSL_CTRL *P, double x, double y, double  radius,  double  angle1,
       double angle2, long type)
          Draws  a  circular  arc with its center at plot coordinates (x, y), starting from angle
          angle1 and end at angle2. Angles must be given in decimal degrees. If angle1 >  angle2,
          a  negative  arc is drawn. The radius is in user units. The type determines how the arc
          is interpreted: PSL_MOVE (1) means set new anchor point, PSL_STROKE  (2)  means  stroke
          the  arc,  PSL_MOVE  + PSL_STROKE (3) means both, whereas PSL_DRAW (0) just adds to arc
          path to the current path.

       long PSL_plotline (struct PSL_CTRL *P, double x, double y, long n, long type)
          Assemble a continuous line through n points whose the plot coordinates are in the x,  y
          arrays.  To continue an existing line, use type = PSL_DRAW (0), or if this is the first
          segment in a multisegment path, set type = PSL_MOVE (1).  To end the segments and  draw
          the  lines,  add  PSL_STROKE  (2).  Thus, for a single segment, type must be PSL_MOVE +
          PSL_STROKE (3). The line is drawn using the current pen attributes. Add  PSL_CLOSE  (8)
          to  type  to  close  the first and last point by the PostScript operators; this is done
          automatically if the first and last point are equal.

       long PSL_plotpoint (struct PSL_CTRL *P, double x, double y, long type)
          Moves the pen from the current to the specified plot coordinates (x, y) and  optionally
          draws and strokes the line, depending on type. Specify type as either a move (PSL_MOVE,
          1), or draw (PSL_DRAW, 2), or draw and stroke (PSL_DRAW + PSL_STOKE, 3)  using  current
          pen attributes. It the coordinates are relative to the current point add PSL_REL (4) to
          type.

       long PSL_plotbox (struct PSL_CTRL *P, double x0, double y0, double x1, double y1)
          Creates a closed box with opposite corners at plot coordinates (x0,y1) and (x1,y1). The
          box  may  be  filled and its outline stroked depending on the current settings for fill
          and pen attributes.

       long PSL_plotpolygon (struct PSL_CTRL *P, double x, double y, long n)
          Creates a closed polygon through n points whose  plot  coordinates  are  in  the  x,  y
          arrays.  The  polygon  may  be  filled and its outline stroked depending on the current
          settings for fill and pen attributes.

       long PSL_plotsegment (struct PSL_CTRL *P, double x0, double y0, double x1, double y1)
          Draws a line segment between the two points (plot coordinates) using  the  current  pen
          attributes.

PLOTTING SYMBOLS

       Here are functions used to plot various geometric symbols or constructs.

       long  PSL_plotaxis (struct PSL_CTRL *P, double tickval, char *label, double fontsize, long
       side)
          Plots a basic axis with tick marks, annotations, and label. Assumes that  PSL_beginaxes
          has  been  called  to  set up positioning and user data ranges. Annotations will be set
          using the fontsize in points. side can be 0, 1, 2, or 3, which  selects  lower  x-axis,
          right y-axis, upper x-axis, or left y-axis, respectively. The label font size is set to
          1.5 times the fontsize.

       long PSL_plotsymbol (struct PSL_CTRL *P, double x, double y, double size[], long symbol)
          Plots a simple geometric symbol centered on  plot  coordinates  (x,  y).  The  argument
          symbol  selects  the  geometric symbol to use.  Most symbols are scaled to fit inside a
          circle of diameter given as size[0],  but  some  symbols  take  additional  parameters.
          Choose  from  these  1-parameter  symbols using the predefined self-explanatory integer
          values   PSL_CIRCLE,   PSL_DIAMOND,    PSL_HEXAGON,    PSL_INVTRIANGLE,    PSL_OCTAGON,
          PSL_PENTAGON,  PSL_SQUARE,  PSL_STAR,  and  PSL_TRIANGLE;  these  may all be filled and
          stroked if PSL_setfill has been called first.  In  addition,  you  can  choose  several
          line-only  symbols  that  cannot  be  filled.  They  are  PSL_CROSS, PSL_DOT, PSL_PLUS,
          PSL_XDASH, and PSL_YDASH.  Finally, more complicated  symbols  require  more  than  one
          parameter to be passed via size. These are PSL_ELLIPSE (size is expected to contain the
          three parameter angle, major, and minor axes, which defines an ellipse with  its  major
          axis  rotated  by  angle  degrees),  PSL_MANGLE  (size  is  expected  to contain the 10
          parameters radius, angle1, and angle2 for the math  angle  specification,  followed  by
          tailwidth,  headlength, headwidth, shape, status, trim1 and trim2 (see PSL_VECTOR below
          for explanation), PSL_WEDGE (size is expected to contain the  three  parameter  radius,
          angle1, and angle2 for the sector specification), PSL_RECT (size is expected to contain
          the two dimensions width and height), PSL_RNDRECT (size is expected to contain the  two
          dimensions  width  and  height  and  the  radius  of the corners), PSL_ROTRECT (size is
          expected to contain the  three  parameter  angle,  width,  and  height,  with  rotation
          relative  to  the  horizontal),  and  PSL_VECTOR  (size  is  expected  to contain the 9
          parameters x_tip, y_tip, tailwidth, headlength, headwidth, shape, status, head1, head2,
          trim1,  and  trim2.   Here (x_tip,y_tip) are the coordinates to the head of the vector,
          while (x, y) are those of the tail. shape 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.0 gives a triangular head, 1.0 gives  an  arrow  shaped
          head.  The  status value is a bit-flag being the sum of several possible contributions:
          PSL_VEC_RIGHT (2) = only draw right half of vector  head,  PSL_VEC_BEGIN  (4)  =  place
          vector  head  at  beginning  of  vector,  PSL_VEC_END (8) = place vector head at end of
          vector, PSL_VEC_JUST_B (0) = align vector beginning at  (x,y),  PSL_VEC_JUST_C  (16)  =
          align  vector  center  at  (x,y),  PSL_VEC_JUST_E  (32)  =  align  vector end at (x,y),
          PSL_VEC_JUST_S (64) = align vector center at (x,y), PSL_VEC_OUTLINE (128) = draw vector
          head  outline  using  default  pen, PSL_VEC_FILL (512) = fill vector head using default
          fill, PSL_VEC_MARC90 (2048)  =  if  angles  subtend  90,  draw  straight  angle  symbol
          (PSL_MANGLE  only).  The  symbol may be filled and its outline stroked depending on the
          current settings  for  fill  and  pen  attributes.   The  parameters  head1  and  head2
          determines what kind of vector head will be plotted at the two ends (if selected).  0 =
          normal vector head, 1 = circle, 2 = terminal crossbar.  Finally, trim1 and trim2 adjust
          the start and end location of the vector.

PLOTTING IMAGES

       Here are functions used to read and plot various images.

       long PSL_plotbitimage (struct PSL_CTRL *P, double x, double y, double xsize, double ysize,
       int justify, unsigned char buffer, long nx, long ny, double f_rgb[], double b_rgb[])
          Plots a 1-bit image image at plot coordinates (x, y)  justified  as  per  the  argument
          justify  (see  JUSTIFICATION  for  details).   The target size of the image is given by
          xsize and ysize in user units. If one of these is specified as zero, the  corresponding
          size  is  adjusted  to  the  other  such that the aspect ratio of the original image is
          retained. buffer is an unsigned character array in scanline orientation with  8  pixels
          per  byte.  nx, ny refers to the number of pixels in the image. The rowlength of buffer
          must be an integral number of 8; pad with zeros. buffer[0] is upper  left  corner.  You
          may replace the foreground color (the set bits) with the f_rgb color and the background
          color (the unset bits) with b_rgb.  Alternatively,  pass  either  color  with  the  red
          component  set  to -1.0 and we will instead issue an image mask that is see-through for
          the specified fore- or background component. See the Adobe Systems PostScript Reference
          Manual for more details.

       long  PSL_plotcolorimage  (struct  PSL_CTRL  *P,  double x, double y, double xsize, double
       ysize, int justify, unsigned char *buffer, long nx, long ny, long depth)
          Plots a 1-, 2-, 4-, 8-, or 24-bit deep image at plot coordinates (x,  y)  justified  as
          per  the argument justify (see JUSTIFICATION for details). The target size of the image
          is given by xsize and ysize in user units. If one of these is specified  as  zero,  the
          corresponding  size is adjusted to the other such that the aspect ratio of the original
          image is retained. This functions sets up a call to the PostScript colorimage or  image
          operators.  The  pixel  values  are  stored  in  buffer, an unsigned character array in
          scanline orientation with gray shade or r/g/b values (0-255). buffer[0]  is  the  upper
          left  corner.  depth  is number of bits per pixel (24, 8, 4, 2, or 1). nx, ny refers to
          the number of pixels in image. The rowlength of buffer must be an  integral  number  of
          8/Idepth.  E.g.  if  depth  =  4,  then  buffer[j]/16  gives  shade for pixel[2j-1] and
          buffer[j%16 (mod 16) gives shade for pixel[2j]. When  -depth  is  passed  instead  then
          “hardware”  interpolation of the image is requested (this is implementation dependent).
          If -nx is passed with 8- (or 24-) bit images then the first one  (or  three)  bytes  of
          buffer  holds  the gray (or r/g/b) color for pixels that are to be masked out using the
          PS Level 3 Color Mask method. See the Adobe Systems  PostScript  Reference  Manual  for
          more details.

       long PSL_plotepsimage (struct PSL_CTRL *P, double x, double y, double xsize, double ysize,
       int justify, unsigned char *buffer, long size, long nx, long ny, long ox, long oy)
          Plots an Encapsulated PostScript (EPS) image at plot coordinates (x,  y)  justified  as
          per  the argument justify (see JUSTIFICATION for details). The target size of the image
          is given by xsize and ysize in user units. If one of these is specified  as  zero,  the
          corresponding  size is adjusted to the other such that the aspect ratio of the original
          image is retained. The EPS file is stored in buffer and has size bytes.  This  function
          simply  includes  the  image  in  the  PostScript  output  stream within an appropriate
          wrapper. Specify position of lower left corner and size of image. nx, ny, ox, oy refers
          to the width, height and origin (lower left corner) of the BoundingBox in points.

       long  PSL_loadimage (struct PSL_CTRL *P, FILE *fp, struct imageinfo *header, unsigned char
       **image)
          Reads the image contents of the EPS file or a raster image pointed to by the open  file
          pointer  fp.  The  routine  can handle Encapsulated PostScript files or 1-, 8-, 24-, or
          32-bit raster images in old, standard, run-length encoded,  or  RGB-style  Sun  format.
          Non-Sun  rasters  are  automatically  reformatted  to  Sun rasters via a system call to
          GraphicsMagick’s or ImageMagick’s convert, if installed. The image is returned via  the
          image pointer.

PLOTTING TEXT

       Here  are  functions  used  to  read  and  plot  text strings and paragraphs.  This can be
       somewhat complicated since we rely on the PostScript interpreter to  determine  the  exact
       dimensions  of  text  items  given  the font chosen. For perfect alignment you may have to
       resort to calculate offsets  explicitly  using  long  PSL_deftextdim,  PSL_set_height  and
       others and issue calculations with PSL_setcommand.

       long  PSL_plottext  (struct  PSL_CTRL *P, double x, double y, double fontsize, char *text,
       double angle, long justify, long mode)
          The text is plotted starting at plot coordinates (x, y) and will make an angle with the
          horizontal.  The  point  (x, y) maps onto different points of the text-string by giving
          various values for justify (see JUSTIFICATION for details).  If  justify  is  negative,
          then  all  leading  and trailing blanks are stripped before plotting. Certain character
          sequences (flags) have special meaning to PSL_plottext. @~ toggles between current font
          and  the  Mathematical  Symbols  font.  @%no%  selects  font no while @%% resets to the
          previous 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.
          @;r/g/b; changes the font color while @;; resets it [optionally append =transparency to
          change  the  transparency  (0–100)  of  the text (the Default is opaque or 0)], @:size:
          changes the font size (@:: resets it), and @_ toggles underline on/off. If text is NULL
          then we assume PSL_plottextbox was called first. Give fontsize in points. Normally, the
          text is typed using solid characters in the current color  (set  by  PSL_setcolor).  To
          draw outlined characters, set mode == 1; the outline will get the current color and the
          text is filled with the current fill color (set by PSL_setfill). Use mode == 2  if  the
          current  fill  is  a  pattern.  Use  mode  == 3 to achieve the same as mode == 1, while
          preventing the outline from obsuring any filled text font; the outline  will  hence  be
          reduced  to  half the selected width. If the text is not filled, mode == 3 operates the
          same as mode == 1.  If fontsize is negative it means that the current point has already
          been set before PSL_plottext was called and that (x, y) should be ignored.

       long PSL_plottextbox (struct PSL_CTRL *P, double x, double y, double fontsize, char *text,
       double angle, long justify, double offset[], long mode)
          This function is used in conjugation with PSL_plottext when a box surrounding the  text
          string  is  desired.  Taking  most of the arguments of PSL_plottext, the user must also
          specify mode to indicate whether the box  needs  rounded  (PSL_YES  =  1)  or  straight
          (PSL_NO  =  0)  corners.  The  box  will  be colored with the current fill style set by
          PSL_setfill. That means, if an outline is desired, and the color of the inside  of  the
          box  should  be  set  with that routine. The outline will be drawn with the current pen
          color (and width). The offset array holds the horizontal  and  vertical  distance  gaps
          between  text  and  the  surrounding text box in distance units. The smaller of the two
          determined the radius of the rounded corners (if requested).

       long PSL_deftextdim (struct PSL_CTRL *P, char *prefix, double fontsize, char *text)
          Computes the dimensions (width and height) required by  the  selected  text  given  the
          current  font  and  its  fontsize  (in  points).  The  values  are stored as PostScript
          variables called prefix_w and prefix_h, respectively. This  function  can  be  used  to
          compute  dimensions  and,  via  BF(PSL_setcommand),  calculate  chances  to  position a
          particular item should be plotted. For instance, if you compute a position this way and
          wish to plot the text there, pass the coordinates to PSL_plottext as NaNs. If prefix is
          BF(-w), BF(-h), BF(-d) or BF(-b), no PostScript variables will  be  assigned,  but  the
          values of width, height, depth, or both width and height will be left on the PostScript
          stack.

       long PSL_setparagraph (struct PSL_CTRL  *P,  double  line_space,  double  par_width,  long
       par_just)
          Initialize  common  settings  to  be  used  when  typesetting  paragraphs  of text with
          PSL_plotparagraph. Specify the line spacing (1 equals  the  font  size)  and  paragraph
          width  (in distance units). Text can be aligned left (PSL_BL), centered (PSL_BC), right
          (PSL_BR), or justified (PSL_JUST) and is controlled by par_just.

       long PSL_plotparagraphbox (struct PSL_CTRL *P, double x, double y, double  fontsize,  char
       *text, double angle, long justify, double offset[], long mode)
          Computes  and plots the text rectangle for a paragraph using the specified fontsize (in
          points). Here, text is an  array  of  the  text  to  be  typeset,  using  the  settings
          initialized by PSL_setparagraph. The escape sequences described for PSL_plottext can be
          used to modify the text. Separate text into several paragraphs by appending \r  to  the
          last  item in a paragraph. The whole text block is positioned at plot coordinates x, y,
          which is mapped to a point on the block specified by  justify  (see  JUSTIFICATION  for
          details).  The  whole  block  is  then  shifted by the amounts shift[]. The box will be
          plotted using the current fill  and  outline  settings.  The  offset  array  holds  the
          horizontal  and  vertical  distance  gaps  between text and the surrounding text box in
          distance  units.  Use  mode  to  indicate  whether   the   box   should   be   straight
          (PSL_RECT_STRAIGHT  =  0), rounded (PSL_RECT_ROUNDED = 1), convex (PSL_RECT_CONVEX = 2)
          or concave (PSL_RECT_CONCAVE = 3).

       long PSL_plotparagraph (struct PSL_CTRL *P, double x,  double  y,  double  fontsize,  char
       *text, double angle, long justify, long mode)
          Typesets  paragraphs of text using the specified fontsize (in points). Here, text is an
          array of the text to be typeset, using the settings  initialized  by  PSL_setparagraph.
          The  escape  sequences  described  for  PSL_plottext  can  be  used to modify the text.
          Separate text into several paragraphs by appending \r to the last item in a  paragraph.
          The whole text block is positioned at plot coordinates x, y, which is mapped to a point
          on  the  block  specified   by   justify   (see   JUSTIFICATION   for   details).   See
          PSL_plotparagraphbox for laying down the surrounding text rectangle first.

       long  PSL_plottextline  (struct  PSL_CTRL *P, double *xpath, double *ypath, long *np, long
       nseg, void *arg1, void *arg2, char  *text[],  double  angle[],  long  n_per_seg[],  double
       fontsize, **long* justify, double offset[], long mode)
          Please  text  along  one  or  more  path  segments.  The function does different things
          depending on the bit flags in mode. A key distinction occurs if the bit  flag  contains
          the  bit  PSL_TXT_CURVED  (64) which means we wish to typeset the text along a variable
          and curved baseline given by the segments in xpath, ypath; otherwise  we  set  straight
          text  (possibly at an angle) and the xpath, ypath are not considered for text placement
          [If no line drawing is desired then these two arrays may be NULL].   We  will  describe
          the  action  taken  for each bit value.  Multiple values may be passed at the same time
          and we processes from low to hight bit.  PSL_TXT_INIT: When mode contains this bit  (1)
          we  will  initialize  all the required variables and store them in the PostScript file.
          PSL_TXT_SHOW: We wish to see the text strings (otherwise they may only serve as  guides
          to  set  up  clip  paths).   PSL_TXT_CLIP_ON: Use the text and the paths to set up clip
          paths.   PSL_TXT_DRAW:  Draw  the  lines  defined   by   the   xpath,   ypath   arrays.
          PSL_TXT_CLIP_OFF:  Turn the text path clipping off.  We pass the text strings via text.
          The locations of text plotting depends on whether PSL_TXT_CURVED is selected.  If it is
          then  you must pass as arg1 the node array indicating at which node in the xpath, ypath
          array the text will be plotted; let arg2 be  NULL.  For  straight  baselines  you  must
          instead  pass  another  set  of  x,y  coordinates  with the locations of the text label
          placements via arg1, arg2.  Each label has its own entry in the angle array.  The  text
          is an array of text pointers to the individual text items. The offset array holds the x
          and y distance gaps between text and the surrounding text box in user units  (the  clip
          path  is  the combination of all these text boxes). Use justify to specify how the text
          string relates to the coordinates (see BF(JUSTIFICATION) for details).  PSL_TXT_FILLBOX
          (128)  will fill the text box (this requires you to first define the text box rgb color
          with PSL_define_rgb by  setting  a  local  PostScript  variable  that  must  be  called
          PSL_setboxrgb).   PSL_TXT_DRAWBOX  (256) will draw the text box outlines (this requires
          you to first define the text box pen with PSL_define_pen by setting a local  PostScript
          variable that must be called PSL_setboxpen). Before calling this function you must also
          initialize a PSL array for line pens and text fonts.

CLIPPING

       Here are functions used to activate and deactivate clipping regions.

       long PSL_beginclipping (struct PSL_CTRL *P, double x, double y, long n, double rgb[], long
       flag)
          Sets  up  a  user-definable clip path as a series on n points with plot coordinates (x,
          y). Plotting outside this polygon will be clipped until PSL_endclipping is  called.  If
          rgb[0]  =  -1  the  inside  of  the path is left empty, otherwise it 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 = PSL_PEN_MOVE_ABS (1) means this
          is the first path in a multisegment clip path. flag = PSL_PEN_DRAW_ABS (2)  means  this
          is the last segment. Thus, for a single path, flag = PSL_PEN_DRAW_AND_STROKE_ABS (3).

       long PSL_endclipping (struct PSL_CTRL *P, long mode)
          Depending  on  the  mode  it  restores  the  clip path. The mode values can be: -n will
          restore n levels of text-based clipping, n will restore n levels of  polygon  clipping,
          PSL_ALL_CLIP_TXT will undo all levels of text-based clipping, and PSL_ALL_CLIP_POL will
          undo all levels of polygon-based clipping.

MISCELLANEOUS FUNCTIONS

       Here are functions used to issue comments or to pass custom PostScript  commands  directly
       to  the  output  PostScript file. In C these functions are declared as macros and they can
       accept a variable number of arguments. However, from FORTRAN only a single  text  argument
       may be passed.

       long PSL_setcommand (struct PSL_CTRL *P, char *text)
              Writes   a  raw  PostScript  command  to  the  PostScript  output  file,  e.g.,  “1
              setlinejoin.

       long PSL_comment (struct PSL_CTRL *P, char *text)
              Writes a comment (text) to the PostScript output file, e.g., “Start  of  graph  20.
              The comment are prefixed with with %% .

AUTHORS

       Paul     Wessel,    School    of    Ocean    and    Earth    Science    and    Technology,
       http://www.soest.hawaii.edu.

       Remko Scharroo, EUMETSAT, Darmstadt, Germany, http://www.eumetsat.int.

BUGS

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

SEE ALSO

       psconvert

REFERENCES

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

COPYRIGHT

       2018, P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis, and F. Wobbe