PSLIB(3gmt) | Generic Mapping Tools | PSLIB(3gmt) |
NAME¶
pslib 4.3 - A PostScript based plotting libraryDESCRIPTION¶
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 pen widths, 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 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 (or ps_plotinit_hires), 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 (c), inch (i), or meter (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 Sun's 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. The pslib is now fully 64-bit compliant. However, only a few function parameters are affected by this (such as the number of point in an array which can now be a 64-bit integer). These few parameters are here given the type long to distinguish them from 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.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)
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, annotpointsize, side)
Plots an axis with tickmarks, annotation, and label.
xpos, ypos, and length are in inches (or cm or meters),
annotpointsize 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 *
annotpointsize. A negative tickval will reverse the sense of
positive direction, e.g., to have the y-axis be positive down.
- void ps_bitimage (xpos, ypos, xlength, ylength, buffer, nx, ny,
invert, f_rgb, b_rgb)
Plots a 1-bit image using the given foreground color
f_rgb and background color b_rgb. 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 invert is 0 then the bits that are 1 are painted with the
foreground color, while bits that are 0 are painted with the backgound color.
If invert is 1, foreground and background are switched. To get a partly
transparent image, set the first index of the foreground or background color
to -1, i.e., f_rgb[0]=-1 or b_rgb[0]=1. See the Adobe Systems
PostScript Reference Manual for more details.
- void ps_circle (xcenter, ycenter, diameter, rgb, 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 ps_clipon.
- void ps_clipon (xarray, yarray, npoints, rgb, 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, depth)
Plots a 1-, 2-, 4-, 8-, or 24-bit deep image. This
functions sets up a call to the PostScript colorimage or image
operators. xpos, ypos, xlength, ylength specify the position of lower
left corner and size (in inches) of image. The pixel values are stored in
buffer, an unsigned character array in scanline orientation with gray
shade or r/g/b values (0 - 255) where 0 is black, 255 is white.
buffer[0] is 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/depth. 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. 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 PostScript Level 3
Color Mask method. See the Adobe Systems PostScript Reference Manual
for more details.
- void ps_colortiles (x0, y0, xlength, ylength, buffer, nx,
ny)
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)
Writes a raw PostScript command to the
PostScript output file, e.g., "1 setlinejoin".
- void ps_comment (text)
Writes a comment (text) to the PostScript
output file, e.g., "Start of graph 2".
- void ps_cross (xcenter, ycenter, diameter)
Plots a cross (x) at the specified point using current
pen-width and -pattern that fits inside a circle of given diameter. No fill
possible.
- void ps_diamond (xcenter, ycenter, diameter, rgb, 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)
Plots a ellipse with its major axis 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_encode_font (font_no)
Will reencode this font using the current encoding vector
if it is not StandardEncoding.
- void ps_epsimage (xpos, ypos, xlength, ylength, buffer, size,
nx, ny, ox, oy)
Plots an Encapsulated PostScript (EPS) image. The
EPS file is stored in buffer and has size bytes. This functions
simply includes the image in the PostScript output stream within an
appropriate wrapper. Specify position of lower left corner and size (in
inches) of image. nx,ny,ox,oy refers to the width, height and origin
(lower left corner) of the BoundingBox.
- void ps_flush ()
Flushes the output buffer.
- void ps_hexagon (xcenter, ycenter, diameter, rgb, 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)
Obsolete, simply passes arguments to
ps_colorimage.
- void ps_imagefill (x, y, n, image, imagefile, invert, dpi,
outline, f_rgb, b_rgb)
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) The set pixels (1) are colored using the RGB combination
in f_rgb, while the unset pixels (0) are painted with b_rgb. Set
the f_rgb[0] to -1 to make set pixels transparent. Set b_rgb[0] to -1 to make
the unset pixels transparent. (ii) If invert is TRUE (1), the set and
unset pixels are interchanged before plotting.
The unit size of the image is controlled by dpi (in dots-per-inch). 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_itriangle (xcenter, ycenter, diameter, rgb, 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.
- long ps_line (xarray, yarray, npoints, type, close, dummy)
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. The dummy is
an obsolete parameter no longer used internally.
- unsigned char *ps_load_image (fp, header)
Reads the image contents of the EPS file or Sun
rasterfile pointed to by the open filepointer fp. The routine can
handle Encapsulated PostScript files or 1-, 8-, 24-, or 32-bit
rasterfiles in old, standard, run-length encoded, or RGB-style Sun
format.
- void ps_octagon (xcenter, ycenter, diameter, rgb, outline)
Plots a octagon 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_patch (xarray, yarray, npoints, rgb, 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.
If more than 20 points are given we pass the buck to ps_polygon.
- void ps_pentagon (xcenter, ycenter, diameter, rgb, outline)
Plots a pentagon 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_pie (xcenter, ycenter, radius, azimuth1, azimuth2, rgb,
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)
Absolute move (kpen=3) or draw (kpen=2),
using current linewidth. Use ( kpen=-2) to make sure the line is
stroked.
- void ps_plotend (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, encoding, 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 using the now-obsolete
GMT 3.4 encoding. To use the ISOLatin1 encoding set the 5th bit to 1.
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 encoding is the name of a character encoding scheme
to be used, e.g., Standard, ISOLatin1, ISO-8859-2, etc. 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_plotinit_hires (plotfile, overlay, mode, xoff, yoff,
xscl, yscl, ncopies, dpi, unit, pagesize, rgb, encoding, eps)
Same as ps_plotinit but expects the page size to
be given in double precision points.
- void ps_plotr (xrel, yrel, kpen)
Move (kpen = 3) or draw (kpen = 2) relative
to current point (see ps_plot). Use ( kpen=-2) to make sure the
line is stroked.
- void ps_plus (xcenter, ycenter, diameter)
Plots a plus (+) at the specified point using current
pen-width and -pattern that fits inside a circle of given diameter. No fill
possible.
- void ps_point (xcenter, ycenter, diameter)
Plots a point (dot) using current pen with given
diameter. Note the linecap setting must first be set to 1 for this function to
work.
- void ps_polygon (xarray, yarray, npoints, rgb, 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.
- void ps_rect (x1, y1, x2, y2, rgb, 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_rotaterect (x, y, angle, xsize, ysize, rgb, outline)
Plots a colored rectangle rotated angle degrees
from baseline. ( x,y) is the center and ( xsize,ysize) are the
dimensions. If outline == 1, the outline will be drawn using current
pen-width and -pattern.
- void ps_rotatetrans (x, y, angle)
Rotates the coordinate system by angle degrees,
then translates origin to ( x,y).
- void ps_segment (x0, y0, x1, y1)
Draws a line segment between the two points using current
pen attributes.
- void ps_setdash (pattern, 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_setfill (rgb, outline)
Sets the current fill color and whether or not outline is
needed for symbols.
- void ps_setfont (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 set to
0.
- void ps_setformat (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)
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_setlinecap (cap)
Changes the current linecap. 0 gives butt cap [Default],
1 gives round, and 2 gives square.
- void ps_setlinejoin (join)
Changes the current linejoin. 0 gives mitered [Default],
1 gives round, and 2 gives bevel joins.
- void ps_setmiterlimit (limit)
Changes the current miter limit. 0 gives default miter,
other values are the cutoff-, acute- angle when mitering takes place.
- void ps_setpaint (rgb)
Changes the current RGB setting for pens and text.
- void ps_square (xcenter, ycenter, diameter, rgb, 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)
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)
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. @;
r/g/b; changes the font color (@;; resets it), @: size: changes
the font size (@:: resets it), and @_ toggles underline on/off. Give fontsize
in points (72 points = 1 inch). Normally, the text is typed using solid
characters. To draw outline characters, set form == 1. If
pointsize is negative it means that the current point has already been
set before ps_text was called and that ( x,y) should be
ignored.- void ps_textbox (x, y, pointsize, text, angle, justify, outline,
dx, dy, rgb)
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)
Translates the origin to (x,y), then rotates the
coordinate system by angle degrees.
- void ps_triangle (xcenter, ycenter, diameter, rgb, 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)
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. Add 8 to outline for a double-headed vector.
- 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)
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 as well.
AUTHOR¶
Paul Wessel, School of Ocean and Earth Science and Technology, 1680 East-West Road, Honolulu, Hawaii 96822, (808) 956-4778, Internet address: pwessel@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.REFERENCES¶
Adobe Systems Inc., 1990, PostScript language reference manual, 2nd edition, Addison-Wesley, (ISBN 0-201-18127-4).Feb 27 2014 | GMT 4.5.13 (SVN) |