Animation (was Re: (Q) Keeping copies of drawing areas)

Niels P. Mayer (mayer@netcom4.netcom.com)
Wed, 22 Jun 1994 00:38:20 GMT

From: kenton@allegro.esd.sgi.com (Kenton Lee)
| In article <1994Jun20.133310.8635@news.brandonu.ca>, ennsnr@BrandonU.CA (R. Moar) writes:
| |> Here is my problem. If i just keep a pixmap and draw a copy of
| |> everything on to the pixmap as well as the drawing area widget,
| |> i wind up doing twice as many draws per simulation iteration, and
| |> it slows it down HORRIBLY. Since speed is of the escense in this
| |> program, this is probably not the way to do it.
|
| You don't have to draw everything twice. Just draw into your pixmap.
| When you want to refresh the screen, do an XCopyArea().

If you've got reasonably complicated sets of objects on the screen, drawing
directly to the screen can result in flicker. You're much better off
drawing to an offscreen pixmap, then copying the changed region onto the
window...

In addition to XCopyArea(), judicious setting of Clip Rectangles while
drawing to the offscreen pixmap (and doing a XCopyArea of only the changed
regions of the offscreen pixmap) results in pretty good portable X windows
animation. Make sure that you are not drawing or copying uneccessary bits
outside of the region that was damaged by a previous frame of animation and
you get good performance.

In WINTERP 2.0 (OSF/Motif Widget INTERPreter), I've integrated Stasko and
Hayes' Xtango algorithm animation package into a new Motif drawing area
based animation "widget." This package allows you to move graphical
objects and composite objects around in a 2.5D coordinate system without
having to worry about taking care of refreshing -- the system automatically
attempts to minimize the amount of screen updating, and as a result, you
get relatively smooth, flicker-free movement without having to deal with
low-level boring details that hamper most graphics programming efforts.

Please feel free to compare the facilities in WINTERP's Xtango widget with
those found in TCL/TK's canvas widget, ezd, and Python's canvas
widget... Since there was some discussion about TCL/TK canvas widget in
comp.lang.python, you'll notice that this is cross-posted.

--------------------
Here's the relevant section of winterp/doc/winterp.doc. See
ftp.x.org:contrib/devel_tools/winterp.tar.gz for details.

** Introduction to Stasko and Hayes' Xtango:

XTANGO is a general purpose animation system that supports
programmers developing color, real-time, 2 & 1/2 dimensional, smooth
animations. The focus of the system is on ease-of-use. XTANGO
utilizes the path-transition animation paradigm which helps move
animation design to an abstract, high level. Programmers need not be
graphics experts to develop their own animations. The Xtango
library used by WINTERP was developed by John T. Stasko
(stasko@cc.gatech.edu) and Doug Hayes at the Georgia Institute of
Technology -- WINTERP uses a modified version of "xtangovararg"
(version 1.52) -- the original is available via anonymous ftp from
par.cc.gatech.edu:pub/xtangovarargs.tar.Z (130.207.119.254).

The WINTERP interface to XTANGO further simplifies the
creation of graphics and animation. It provides a new widget class
TANGO:WIDGET_CLASS in which Tango animations may be displayed. Within
the TANGO:WIDGET_CLASS instance, a set of TANGO:IMAGE_CLASS instances
may be displayed and animated -- the images may be lines, rectangles,
circles, ellipses, polylines, polygons, splines, bitmaps, GIFs, text,
or a composite of the aforementioned types. All Xtango images types
other that text, bitmaps and GIFs are pixel independent, thereby
simplifying scaling, zooming, and resizing of Xtango graphics.

The WINTERP interface to XTANGO allows programmers to use the XLISP
object system to create new images with new functionality and
encapsulated animation capabilities by subclassing and/or composing the
previously mentioned image types. Unlike Xtango, animations and
graphics may be developed interactively in WINTERP. Furthermore,
WINTERP's Xtango performs automatic memory management on all types
associated with Xtango -- storeage associated with paths, transitions,
images, and the tango widget is automatically deallocated
when the data is no longer needed.

For details on the Xtango system underlying WINTERP's interface to
Xtango, see <winterp-top-dir>/doc/xtangodoc.tex (LaTeX format)
and <winterp-top-dir>/doc/xtangodoc.ps.Z (compressed postscript).
For a conceptual overview of Xtango, see
<winterp-top-dir>/doc/xtango.ps.Z (compressed postscript).

** TANGO Colors (TANGO_COLOR):

TANGO_COLOR is a FIXNUM representing a Pixel value specific to the
Xtango package. One may also pass STRING values as TANGO_COLOR,
typically, these are color names from /usr/lib/X11/rgb.txt, e.g.
"red". One may also specify a hexadecimal value for the color, e.g.
"#FF0000".

The following constants represent predefined Xtango color values:
TANGO_COLOR_WHITE
TANGO_COLOR_YELLOW
TANGO_COLOR_GREEN
TANGO_COLOR_BLUE
TANGO_COLOR_ORANGE
TANGO_COLOR_RED
TANGO_COLOR_MAROON
TANGO_COLOR_BLACK

See also <<TANGO:WIDGET_CLASS Method :LOAD_COLOR>> as a way to load
colors into Xtango's colormap. If you are repeatedly using the same
color, it is more efficient to use the TANGO_COLOR fixnum as returned
by :LOAD_COLOR or the color constants listed above, rather than forcing
a STRING to TANGO_COLOR conversion to be done multiple times.

Note that the underlying Xtango library limits <tango_color> arguments
to work only with the eight "basic" tango colors mentioned above.
This limitation only applies to programmatically changing the colors
of an image during an animation, e.g. through methods :TAP_COLOR and
:TX_COLOR, and function TANGO:PATH_COLOR. <tango_color>
arguments for image creation can use the full set of colors from
/usr/lib/X11/rgb.txt. If the specified color is not
available, an error will be signalled during color allocation.

** TANGO Locations and Coordinates (TANGO_LOC):

Locations in WINTERP's Xtango are represented as XLISP
COMPLEX type data #C(<x> <y>), where <x> and <y> are FLONUMs
representing the location within the TANGO:WIDGET_CLASS instance.
Using COMPLEX data simplifies mathematical and geometric calculations
because WINTERP's XLISP can do mathematical operations on
COMPLEX numbers (+, -, *, /, SIN, COS, TAN, ASIN, ACOS, ATAN, EXPT,
EXP, SQRT, etc).

For an example of using COMPLEX domain calculations, see
<winterp-top-dir>/examples/xtango/test-dial.lsp which
defines a "dial widget" using XTANGO graphics, and employs
COMPLEX domain calculations involving "cis" ==
COS(x) + i*SIN(x) = EXP(i*x). In particular see
DIAL-WIDGET-CLASS (<winterp-top-dir>/examples/xtango/wcls-dial.lsp)
and POLAR-ARROW-IMAGE-CLASS
(<winterp-top-dir>/examples/xtango/icls-plrar.lsp).

Note that the coordinate system for XTANGO is the opposite of
what you'd expect given the useage of COMPLEX domain coordinates --
by default, the visible area of the TANGO:WIDGET_CLASS instance
is represented by the following border coordinates:

#C(0.0 0.0) #C(1.0 0.0)
+---------------+
| |
| |
| |
| |
+---------------+
#C(0.0 1.0) #C(1.0 1.0)

The coordinates bounding the viewing area can be changed by invoking
methods :ZOOM, :PAN, or :SET_COORD. Method :INQ_COORD returns the
border coordinates.

** TANGO Paths (TANGO_PATH):

A TANGO Path is a data type that identifies an animation path along
which an image is modified. A path can be thought of as a list of
relative offsets, each relative to the previous position.

Paths are applied to Xtango transition operations (methods :TX_* on
TANGO:IMAGE_CLASS and subclasses); each element in a path is applied
to the appropriate transition operator, becoming a single frame of
animation when the transition is performed via TANGO:TX_PERFORM or via
:PERFORM keyword supplied to a transition operation.

*** Function TANGO:PATH_CREATE (TANGOpath_create(), TANGOpath_null()):

(TANGO:PATH_CREATE [<path>...])
==> returns a TANGO_PATH node representing a path
(<x0,y0>...<xn,yn>)

The [<path>...] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
example: (TANGO:PATH_CREATE)
==> returns null path of length 1.

* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
example: (TANGO:PATH_CREATE 2)
==> returns null path of length 2.

* else, if <path> is one or more COMPLEX (e.g. #C(<x> <y>) arguments
then a path element is created for each COMPLEX argument,
with the x and y offsets of each path element set to each
complex argument's <x> and <y> parts.
example: (TANGO:PATH_CREATE #C(0.1 0.1) #C(0.1 0.1)
#C(0.1 0.1) #C(0.1 0.1))
==> returns a path of length 4 w/
x and y offsets set to 0.1 .

* else, if <path> is a a pair of sequences (LIST or ARRAY) of FLONUMS,
then a path of the same length as the sequences is created,
with the x and y offsets set to the corresponding <x> <y>.
example: (TANGO:PATH_CREATE #'(0.1 0.1 0.1 0.1)
#'(0.1 0.1 0.1 0.1))
==> returns a path of length 4 w/
x and y offsets set to 0.1 .

*** Function TANGO:PATH_LENGTH (TANGOpath_length()):

(TANGO:PATH_LENGTH <path>)
==> returns a FIXNUM representing length of <path>.

<path> is a TANGO_PATH node, created (for example) by
function TANGO:PATH_CREATE.

This routine returns the numbers of offsets in the given path.

*** Function TANGO:PATH_DX (TANGOpath_dx()):

(TANGO:PATH_DX <path>)
==> returns a FLONUM representing the x distance traversed by
path.

<path> is a TANGO_PATH node, created (for example) by
function TANGO:PATH_CREATE.

This routine returns the <x> distance that the given <path>
traverses from start to finish.

*** Function TANGO:PATH_DY (TANGOpath_dy()):

(TANGO:PATH_DY <path>)
==> returns a FLONUM representing the y distance traversed
by path

<path> is a TANGO_PATH node, created (for example) by
function TANGO:PATH_CREATE.

This routine returns the <y> distance that the given <path> traverses
from start to finish.

*** Function TANGO:PATH_TYPE (TANGOpath_type()):

(TANGO:PATH_TYPE <k_type>)
==> returns a TANGO_PATH node.

<k_type> is a keyword argument, one of
:STRAIGHT -- move right
:CLOCKWISE -- move clockwise right in an upward arc
:COUNTERCLOCKWISE -- move counterclockwise left in an upward arc

Each of these paths when created will have 20 relative offset points
and will change in <x> by a total value of 0.2 animation coordinate
system units.

The paths created by this routine will probably not be utilized as is,
although there is no reason why they cannot be. They are provided
primarily as starting paths for use in the subsequent path modification
routines.

*** Function TANGO:PATH_COLOR (TANGOpath_color()):

(TANGO:PATH_COLOR <color>)
==> returns a TANGO_PATH node.

<color> is a FIXNUM ranging from 0-7 representing a Xtango pixel value.
The following symbols have been predefined with Xtango pixel values:
TANGO_COLOR_WHITE 0
TANGO_COLOR_YELLOW 1
TANGO_COLOR_GREEN 2
TANGO_COLOR_BLUE 3
TANGO_COLOR_ORANGE 4
TANGO_COLOR_RED 5
TANGO_COLOR_MAROON 6
TANGO_COLOR_BLACK 7
(Note that the underlying Xtango path-color primitives
do not allow other Xtango colors to be defined for
path operations).

This routine returns a one offset path that will change an image to
the given color when the path is used as an argument to tango-image
method :TX_COLOR. The direction of the offset in the path determines
the color to utilize. For example, if there is an image
'red_door_image' that you wish to be painted black, you could call
(send red_door_image :TX_COLOR (TANGO:PATH_COLOR TANGO_COLOR_BLACK))

For the above usage, you could also avoid calling TANGO:PATH_COLOR
entirely by using method :TAP_COLOR, e.g.
(send red_door_image :TAP_COLOR TANGO_COLOR_BLACK).
Note that colors created with TANGO:WIDGET_CLASS method :LOAD_COLOR
cannot be used as parameters to this function. The supported colors are
TANGO_COLOR_WHITE thru TANGO_COLOR_BLACK.

*** Function TANGO:PATH_ADD_TAIL (TANGOpath_add_tail()):

(TANGO:PATH_ADD_TAIL <path> <num>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<num> is a positive FIXNUM, if <=0, the value 0 is used.

This routine elongates a path by extending the "tail" of the path.
The parameter <num> designates the number of null #C(0.0 0.0) offsets
that will be apppended to the given <path>, producing a new path that
is returned.

*** Function TANGO:PATH_ADD_HEAD (TANGOpath_add_head()):

(TANGO:PATH_ADD_HEAD <path> <num>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<num> is a positive FIXNUM, if <=0, the value 0 is used.

This routine elongates a path by extending the "head" of the path.
The parameter <num> designates the number of null #C(0.0 0.0) offsets
that will be prepended to the given <path>, producing a new path that
is returned.

*** Function TANGO:PATH_DELETE_TAIL (TANGOpath_delete_tail()):

(TANGO:PATH_DELETE_TAIL <path> <num>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<num> is a positive FIXNUM, if <=0, the value 0 is used.

This routine provides a way of shortening a path. The parameter <num>
designates the number of offsets that will be removed from tail of the
given <path> in order to produce a new path that is returned.

*** Function TANGO:PATH_DELETE_HEAD (TANGOpath_delete_head()):

(TANGO:PATH_DELETE_HEAD <path> <num>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<num> is a positive FIXNUM, if <=0, the value 0 is used.

This routine provides a way of shortening a path. The parameter
<num> designates the number of offsets that will be removed from head
of the given <path> in order to produce a new path that is returned.

*** Function TANGO:PATH_REVERSE (TANGOpath_reverse()):

(TANGO:PATH_REVERSE <path>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine returns a path that is the inverse of the given <path>.
Being an inverse path means that the order of offsets is reversed,
and each offset points in the exact opposite direction. This routine
provides a way for an image to retrace its tracks from a movement
transition.

*** Function TANGO:PATH_ROTATE (TANGOpath_rotate()):

(TANGO:PATH_ROTATE <path> <deg>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<deg> is a positive FIXNUM, ranging from 0 to 360 (degrees).

This routine returns a path that corresponds to the rotation of the
given <path> in a counter-clockwise motion. The number of degrees to
rotate is provided by the FIXNUM integer parameter <deg> which should
be between 0 and 360.

*** Function TANGO:PATH_INTERPOLATE (TANGOpath_interpolate()):

(TANGO:PATH_INTERPOLATE <path> <factor>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<factor> is a FLONUM

This routine returns a path in which the number of offsets is modified
by a factor given by the <factor> parameter. If a path with length 10
is interpolated with a factor of 2.0, the returned path will have 20
offsets. If the factor is 0.3, the path will have 3 offsets. Straight
linear interpolation is used. Consequently, when interpolating a path
with choppy, wavy motion characteristics, individual extrema may be
lost with certain <factor> parameters.

*** Function TANGO:PATH_SCALE (TANGOpath_scale()):

(TANGO:PATH_SCALE <path> <scale>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<scale> is a COMPLEX number #C(<dx> <dy>) where <dx> <dy> are FLONUMs.

This routine returns a path in which each offset is scaled by the
given factors in X and Y. That is, each offsets' X and Y values are
mulitplied by the respective <dx> and <dy> factors specified in the
COMPLEX <scale> argument. So, for example, to return a path that
would be the reflection of a path across an imaginary vertical line,
<scale> == #C(-1.0 1.0).

*** Function TANGO:PATH_EXTEND (TANGOpath_extend()):

(TANGO:PATH_EXTEND <path> <extension>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<extension> is a COMPLEX number #C(<dx> <dy>) where <dx> <dy>
are FLONUMs.

This routine returns a path in which each offset is extended by the
given factors in X and Y. That is, each offsets' X and Y values have
the respective <dx> and <dy> factors (specified in the COMPLEX
<extension>) added to them.

*** Function TANGO:PATH_COPY (TANGOpath_copy()):

(TANGO:PATH_COPY <path>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine returns a new path that has an exact duplicate list of
offsets as the given <path>.

*** Function TANGO:PATH_ITERATE (TANGOpath_iterate()):

(TANGO:PATH_ITERATE <path> <factor>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.
<factor> is a FLONUM

This routine returns a path which is an iteration of a given <path>.
The <factor> FLONUM parameter provides how many times the given path
should be repeated in the path to be created.

*** Function TANGO:PATH_CONCATENATE (TANGOpath_concatenate()):

(TANGO:PATH_CONCATENATE <path-0> <path-1> <path-2> ...)
==> returns a TANGO_PATH node.

<path-i> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine creates a path which is the concatenation of some number
of other paths. The paths will be concatenated in order from the
<path-0> position on to the last <path-n> position. The first offset
of a path is relative to the last offset of the previous path.

*** Function TANGO:PATH_COMPOSE (TANGOpath_compose()):

(TANGO:PATH_COMPOSE <path-0> <path-1> <path-2> ...)
==> returns a TANGO_PATH node.

<path-i> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine returns a path which is the composition of the paths
given in the <path-0> to <path-n> parameters. By composition, we
mean a cumulative combination on an offset by offset basis. If a path
is thought of as a vector, the composition of paths produces a new
vector that has the same length as the originals and is like the
vector sum of the original path vectors. Only paths with an equal
number of offsets can be composed. Otherwise, an error is signalled.

Essentially, path composition takes all the first relative <x> <y>
offsets and adds them together to make a new cumulative first <x>,<y>
offset. This is done for each offset in the paths.

*** Function TANGO:PATH_DISTANCE (TANGOpath_distance()):

(TANGO:PATH_DISTANCE <from_loc> <to_loc> <distance>)
==> returns a TANGO_PATH node.

<from_loc> is a COMPLEX number #C(<from_x> <from_y>),
where <from_x>, <from_y> are FLONUMs.
<to_loc> is a COMPLEX number #C(<to_x> <to_y>),
where <to_x>, <to_y> are FLONUMs.
<distance> is a FLONUM.

This routine returns a path that proceeds in a straight line from the
given <from_loc> to the given <to_loc> with the condition that the
path will have an offset every time the given <distance> has been
covered. If the given distance is larger than the distance between
the <from_loc> and <to_loc>, the path is only given one offset. This
routine is useful to create paths that will make images move at the
same velocity.

*** Function TANGO:PATH_EXAMPLE (TANGOpath_example()):

(TANGO:PATH_EXAMPLE <from_loc> <to_loc> <path>)
==> returns a TANGO_PATH node.

<from_loc> is a COMPLEX number #C(<from_x> <from_y>),
where <from_x>, <from_y> are FLONUMs.
<to_loc> is a COMPLEX number #C(<to_x> <to_y>),
where <to_x>, <to_y> are FLONUMs.
<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine returns a path which "looks like" the given example
<path>, but which would move from the logical <from_loc> to the
logical <to_loc>. The created path will have the same number of
offsets as the given path. The general flow of movement in the
example path is followed as closely as possible by maintaining the
same ratios between control points in both paths. Clearly, however,
if the two paths move in opposite directions, they will not look much
alike. Typically, this routine will be used when one wants an image
to end up in some specific position, with the image following some
rough, given trajectory path in order to get there.

*** Function TANGO:PATH_MOTION (TANGOpath_motion()):

(TANGO:PATH_MOTION <from_loc> <to_loc> <path_type>)
==> returns a TANGO_PATH node.

<from_loc> is a COMPLEX number #C(<from_x> <from_y>),
where <from_x>, <from_y> are FLONUMs.
<to_loc> is a COMPLEX number #C(<to_x> <to_y>),
where <to_x>, <to_y> are FLONUMs.
<path_type> is a keyword, either :STRAIGHT,
:CLOCKWISE, or :COUNTERCLOCKWISE.

This routine returns a path with movement characteristics of the
given <path_type>, but that also begins at the location with logical
X and Y coordinates of <from_loc> and proceeds to the location with
logical X and Y coordinates of the <to_loc>. Note that the provided
from and to locations need not have absolute screen coordinate
meaning. Because a path is made up of a group of relative offsets,
these locations are provided just as necessary aids in the path
creation. For example, the same path will be created using from ==
#C(0.2 0.2) and to == #C(0.4 0.4) as using from == #C(0.7 0.7) and to
== #C(0.9 0.9). Most often however, the provided locations will be
specific window coordinates chosen to move a certain image to a
specific location.

The created path will contain 20 offsets and will be modelled to fit
the given <path_type>, which may be one of the following keywords
:STRAIGHT, :CLOCKWISE, or :COUNTERCLOCKWISE. The straight option
creates a path that is a direct line from {\em fromloc} to {\em
toloc} with equally spaced offsets. The two clock motions will
create a path that curves in the given clock motion direction.

Essentially, this routine is just
(TANGO:PATH_EXAMPLE <from_loc> <to_loc>
(TANGO:PATH_TYPE <path_type>)).

*** Function TANGO:PATH_SMOOTH (TANGOpath_smooth()):

(TANGO:PATH_SMOOTH <path>)
==> returns a TANGO_PATH node.

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.


This routine returns a path which is a "smoother" version of the
given <path>. Essentially, each offsets' value is determined by
averaging in the neighboring offsets' values. Currently, we use 2
times the designated offset plus one time the previous and subsequent
offsets.

*** Function TANGO:PATH_FREE (TANGOpath_free()):

(TANGO:PATH_FREE <path>)
==> returns NIL

<path> is a TANGO_PATH as returned by other TANGO:PATH_* routines.

This routine frees the memory space occupied by the TANGO_PATH arg
<path>.

Note that WINTERP automatically frees any TANGO_PATH node which is no
longer referenced. If you happen to store a TANGO_PATH on a global
variable, or within a closure (on function, method, lambda, etc) it
will not get garbage collected, so you may want to use this function
to explicitly free it.

If very long paths are being created, but garbage collections are
happening infrequently, the process size will grow larger than it
needs to be because memory taken up by TANGO_PATH's will not be able
to be reused until a garbage collection occurs.

Calling TANGO:PATH_FREE frees the Xtango storage used by
<path>. Subsequent references of the node passed to this function via
<path> will signal an error indicating that the path has been
freed. This might happen, for example, when you use the <path> as an
argument to a :TX_* TANGO_IMAGE_CLASS method.

** TANGO Transitions (TANGO_TRANS):

A transition is a data-type representing a graphics action to be
performed on a Tango Image object. A transition action is comprised of
1) the actual type of the transition such as fill style change,
visibility change, color change, motion, resizing, and so forth, or
some combination thereof;
2) the image to which it applies, and
3) A path along which to apply the transition. A sequence of
values, each element of which becomes a single frame of animation.

The TANGO_TRANS type is returned by the following methods on
TANGO:IMAGE_CLASS (and subclasses thereof) when they are called
without the :PERFORM keyword: :TX_MOVE, :TX_VISIBLE, :TX_COLOR,
:TX_RAISE, :TX_LOWER, :TX_DELAY, :TX_REFRESH, :TX_DELETE, :TX_ZOOM,
:TX_FILL, :TX_RESIZE, :TX_RESIZE1... :TX_RESIZE7, :TX_GRAB1...
:TX_GRAB7, and :TX_SHUFFLE. See below for details on the transition
methods and the particular subclasses of TANGO:IMAGE_CLASS to which
they apply.

The results of the methods returning TANGO_TRANS can be operated on by
a variety of functions:

*** Function TANGO:TX_ITERATE (TANGOtrans_iterate()):

(TANGO:TX_ITERATE [:PERFORM] <tango_trans> <num-iterations>)
==> returns <tango_trans> object, or NIL if :PERFORM keyword
given.

This routine returns a transition which corresponds to performing the
given <tango_trans> <num> times, one immediately after the other.
One example use of this routine is to make an image repeat a given
behavior.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The <tango_trans> argument is of type TANGO_TRANS, which is produced
by one of the :TX_* methods on TANGO:IMAGE_CLASS and its subclasses.

The <num-iterations> argument is a FIXNUM representing the number of
times to iterate..

*** Function TANGO:TX_CONCATENATE (TANGOtrans_concatenate()):

(TANGO:TX_CONCATENATE [:PERFORM] <trans-1>
[<trans-2> [<trans-3> [...]]])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This routine returns a transition which corresponds to the
concatenation of the transitions in the <trans-i> parameters. The
order of the incoming transitions corresponds to the order that they
will be performed in the concatenation, with transition <trans-1>
being first. This one logical transition can then be composed,
iterated, etc., with other transitions to achieve various desired
animations.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

Each <trans-i> argument is of type TANGO_TRANS, which is produced by
one of the :TX_* methods on TANGO:IMAGE_CLASS and its subclasses.

*** Function TANGO:TX_COMPOSE (TANGOtrans_compose()):

(TANGO:TX_COMPOSE [:PERFORM] <trans-1> [<trans-2> [<trans-3> [...]]])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This routine is very important because it provides the ability to
have many images moving and changing around the screen at the same
time. It returns a transition which is the composition of the
<trans-i> arguments. By composition, we mean the "concurrent"
execution of all the transitions involved. When transitions are
composed, individual frames of the transition are combined, e.g., the
first frames, the second frames, etc. For transitions, each offset
in the path utilized corresponds to one frame. Transitions of
unequal "length" can be composed. Transitions shorter than the
longest transition will simply have null action frames added to their
tails. Consequently, all the action will start together but will
finish according to how many frames are in the transition. Note: to
compose more than 50 transitions, you need to call this routine twice
with the result of the first call as a parameter to the second call.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

Each <trans-i> argument is of type TANGO_TRANS, which is produced by
one of the :TX_* methods on TANGO:IMAGE_CLASS and its subclasses.

*** Function TANGO:TX_PERFORM (TANGOtrans_perform()):

(TANGO:TX_PERFORM <tango_trans>)
==> returns NIL

TANGO:TX_PERFORM actually carries out the given transition which has
been created via one of the transition creation routines (:TX_*
methods). All the involved graphical images are animated in the ways
specified in the transition when it was created.

The <tango_trans> argument is of type TANGO_TRANS, which is produced
by one of the :TX_* methods on TANGO:IMAGE_CLASS and its subclasses.

Note that simple transitions may be achieved via the :PERFORM keyword
on the TANGO:IMAGE_CLASS :TX_* methods -- the :PERFORM keyword allows
:TX_* method to directly invoke the functionality of
TANGO:TX_PERFORM. More complex transitions require calls to
TANGO:TX_PERFORM; these transitions are stored in the user's program
and performed later; alternately the transitions may be the result of
functions like TANGO:TX_ITERATE, TANGO:TX_CONCATENATE,
TANGO:TX_COMPOSE.

*** Function TANGO:TX_FREE (TANGOtrans_free()):

(TANGO:TX_FREE <tango_trans>)
==> returns NIL.

This routine frees the space associated with <tango_trans>. Calling
this routine is not absolutely necessary, since WINTERP's garbage
collector will automatically free up any TANGO_TRANS data. However,
if you are creating many transitions which are briefly used, then
discarded, you may be able to prevent un-necessary memory-size growth
by explicitly freeing TANGO_TRANS objects -- in the worst case, where
the only "garbage" being generated is TANGO_TRANS objects, you may
end up allocating 2000 (default) nodes before any of the space gets
freed by the garbage collector. The XLISP ALLOC function allows the
2000 default to be changed.

The <tango_trans> argument is of type TANGO_TRANS, which is produced
by one of the :TX_* methods on TANGO:IMAGE_CLASS and its subclasses.

** TANGO:WIDGET_CLASS -- the Xtango 2-D animation/graphics widget

*** equivalent Xt 'WidgetClass':

xmDrawingAreaWidgetClass --

TANGO:WIDGET_CLASS is a Motif XmDrawingArea widget subclass which
interfaces to Stasko&Hayes' XTANGO 2-D Animation Package
(xtangovararg, VERSION 1.52). All resources, callbacks, and behavior
of this widget are documented in XmDrawingArea(3x).

xmDrawnButtonWidgetClass --

If the widget is created with the optional :BUTTON argument,
then then Xtango functionality will be available
in a Motif XmDrawnButton subclass. All resources, callbacks, and
behavior of this widget are documented in XmDrawnButton(3x).

*** TANGO:WIDGET_CLASS Method :NEW/:ISNEW (XtCreateWidget()):

(send TANGO:WIDGET_CLASS :new [:managed/:unmanaged] ...)
--> XtCreateWidget(... xmDrawingAreaWidgetClass ...)

(send TANGO:WIDGET_CLASS :new [:managed/:unmanaged] :BUTTON ...)
--> XtCreateWidget(... xmDrawnButtonWidgetClass ...)

See WIDGET_CLASS :NEW method for information on the standard
widget creation parameters depicted by "..." above.

The optional :BUTTON argument causes the Xtango drawing area
semantics to be included in a Motif XmDrawnButton widget.
This is useful for pushbuttons, menu entries, etc in which
you want to have graphics and/or animations appear.

*** TANGO:WIDGET_CLASS Method :ADD_CALLBACK/:SET_CALLBACK (XtAddCallback()):

(send <tangowidget> :ADD_CALLBACK ...)
--> returns: <callback_id_object> of type CALLBACKOBJ
(send <tangowidget> :SET_CALLBACK ...)
--> returns: <callback_id_object> of type CALLBACKOBJ

These methods work just like the :ADD_CALLBACK/:SET_CALLBACK
methods on WIDGET_CLASS except that this method knows
how to get call_data values from the XmDrawingAreaCallbackStruct:

typedef struct
{
int reason;
XEvent *event;
Window window;
} XmDrawingAreaCallbackStruct;

or, if created with the :BUTTON submessage,
XmDrawnButtonCallbackStruct:

typedef struct
{
int reason;
XEvent *event;
Window window;
#ifdef MOTIF_1.1
int click_count; /* FIELD EXISTS ONLY IN MOTIF 1.1 */
#endif MOTIF_1.1
} XmDrawnButtonCallbackStruct;

If the <tangowidget> was created without the :BUTTON submessage,
the following symbols are valid for the callback
bindings list; When the callback fires, it will bind that symbol's
value in the lexical environment of the callback:
CALLBACK_WIDGET -- the WIDGETOBJ of the callback
CALLBACK_REASON -- the reason symbol for the callback
CALLBACK_XEVENT -- the XEvent* that caused the callback
CALLBACK_WINDOW -- the Window of the callback

If the <tangowidget. was created with the :BUTTON submessage, then
the following callback symbols are valid:
CALLBACK_WIDGET -- the WIDGETOBJ of the callback
CALLBACK_REASON -- the reason symbol for the callback
CALLBACK_XEVENT -- the XEvent* that caused the callback
CALLBACK_WINDOW -- the Window of the callback
#ifdef MOTIF_1.1
CALLBACK_CLICK_COUNT -- a FIXNUM representing the number of
clicks upon the button. The click count
will only be > 1 when resource
:XMN_MULTI_CLICK == :MULTICLICK_KEEP
#endif /* MOTIF_1.1 */

*** TANGO:WIDGET_CLASS Method :BEGIN_DRAWING (animate_begin()):

(send <tango-widget> :BEGIN_DRAWING)
==> returns NIL.

You must call this routine prior to doing any drawing in a
TANGO:WIDGET_CLASS instance, but after the widget's windows have
been created. Typically, one should call this on the first expose
event received by the widget -- use an :XMN_EXPOSE_CALLBACK.

XTANGO-WIDGET-CLASS, and XTANGO-BUTTON-WIDGET-CLASS are subclasses
of TANGO:WIDGET_CLASS which automatically call this method in an
:XMN_EXPOSE_CALLBACK. To get those subclasses, do:
(require "xtango/cls-widget")
(require "xtango/cls-image")

*** TANGO:WIDGET_CLASS Method :PAN :

(send <tango-widget> :PAN <direction> [<pan-amount-flonum>])
==> returns NIL.

<direction> can be one of
:UP -- pans the xtango view-window up.
:DOWN -- pans the xtango view-window down.
:LEFT -- pans the xtango view-window left.
:RIGHT -- pans the xtango view-window right.

<pan-amount-flonum> is an optional flonum indicating amount to
pan the viewer. If ommitted, it defaults to 0.2.

This method pans the viewing area such that the top/left corner
of the viewing area is no longer #C(0.0 0.0) and the bottom/right
corner is no longer located at #C(1.0 1.0).

To reset the viewing area back to the default, call:
(send <tango-wdiget> :SET_COORD 0.0 1.0 1.0 0.0)
The current coordinates associated with the viewing area may be
retrieved via
(send <tango-wdiget> :INQ_COORD)

*** TANGO:WIDGET_CLASS Method :ZOOM :

(send <tango-widget> :ZOOM <direction> [<zoom-amount-flonum>])
==> returns NIL.

<direction> can be one of
:IN -- zoom in
:OUT -- zoom out

<zoom-amount-flonum> is an optional FLONUM indicating amount to
zoom the viewer. If ommitted, it defaults to 0.8

This method zooms the viewing area in or out, causing the images
displayed within to change in size. Note that the current version
of WINTERP/Xtango has a bug -- bitmap, text, and gif images don't
resize upon zooming. After zooming, the top/left corner of the viewing
area is no longer #C(0.0 0.0) and the bottom/right corner is no longer
located at #C(1.0 1.0).

To reset the viewing area back to the default, call:
(send <tango-wdiget> :SET_COORD 0.0 1.0 1.0 0.0)
The current coordinates associated with the viewing area may be
retrieved via
(send <tango-wdiget> :INQ_COORD)

*** TANGO:WIDGET_CLASS Method :SET_COORD (TANGOset_coord()):

(send <tango-widget> :SET_COORD <lx> <by> <rx> <ty>)
==> returns NIL.

where: <lx> - left x coord (flonum) (default, 0.0)
<by> - bottom y coord (flonum) (default, 1.0)
<rx> - right x coord (flonum) (default, 1.0)
<ty> - top y coord (flonum) (default, 0.0)

This method is used to manually set the window boundary coordinates
which start by default at 0.0 to 1.0 in both directions (origin is at
upper left corner). This routine then allows you to zoom or pan the
display from with an animation file. It is advisable to maintain the
same aspect ratio between <x> and <y> or weird things may happen. A
sequence of calls to this routine with gradually tightening window
coordinates will provide a very nice smooth zooming functionality.

*** TANGO:WIDGET_CLASS Method :INQ_COORD (TANGOinq_coord()):

(send <tango-widget> :INQ_COORD)
==> returns list of FLONUMs (<lx> <by> <rx> <ty>)
(this data can subsequently be APPLY'd to :SET_COORD)

This routine returns the current value of the window's boundary
coordinates.

*** TANGO:WIDGET_CLASS Method :SET_ANIMATION_EVENT_PROCESSING :

(send <tango-widget> :SET_ANIMATION_EVENT_PROCESSING <event_mask>)
--> returns NIL.

<event_mask> is a FIXNUM, created by taking the LOGIOR of
KEY_PRESS_MASK BUTTON_PRESS_MASK, and EXPOSURE_MASK. Any other mask
values (as used perhaps by :ADD_EVENT_HANDLER/:SET_EVENT_HANDLER
methods) are ignored.

KEY_PRESS_MASK: interrupts running animation when Control-C
entered in the window running the animation.
BUTTON_PRESS_MASK interrupts running animation when any mouse
button is clicked within the window running
the animation.
EXPOSURE_MASK: if the window running the animation is
obscured then exposed, LOGIORing this value
to the event mask will cause the entire
window to refresh its graphics. When not
set, animation windows will not completely
refresh themselves until the current
animation's transition has finished.

NOTE: By default, all TANGO:WIDGET_CLASS instances are created with
the following setting:
(send <tango-widget> :SET_ANIMATION_EVENT_PROCESSING
(logior KEY_PRESS_MASK EXPOSURE_MASK))

*** TANGO:WIDGET_CLASS Method :SET_DELAY :

(send <tango-widget> :SET_DELAY <sleep_usecs_fixnum>)
==> returns NIL.

This method slows down an animation if it is running too fast on
your host/display. <sleep_usecs_fixnum> is a FIXNUM representing
the number of miscroseconds to sleep between frames of the
animation. If the value is 0, then no delay occurs between
frames of animation. The default value is 0.

*** TANGO:WIDGET_CLASS Method :SET_DEBUG :

(send <tango-widget> :SET_DEBUG <debug_p>)
==> returns NIL.

When <debug_p> is non-NIL, this method turns on Xtango's internal
debugging output -- prints out names of Xtango functions being called
during the course of an animation. The output is sent to *TRACE-OUTPUT*
which defaults to *TERMINAL-IO* unless redirected.

*** TANGO:WIDGET_CLASS Method :MONO_PATTERN_REPRESENTATION :

(send <tango-widget> :MONO_PATTERN_REPRESENTATION <kind>)
--> returns NIL if <tango-widget> is on a color screen, and
doesn't make any changes.
--> returns T if <tango-widget> is on a monochrome screen,

where <kind> can be
:COLORS -- patterns represent colors on mono displays.
:FILLS -- patterns represent fill-styles on mono displays.

*** TANGO:WIDGET_CLASS Method :REFRESH (TANGO_refresh()):

(send <tango-widget> :REFRESH)
==> returns NIL.

This method redraws all the tango images visible in <tango-widget>.
Typically, one calls :REFRESH from an :XMN_EXPOSE_CALLBACK on
<tango-widget>. One might also call :REFRESH to force the next frame
of animation to be displayed thereby displaying any images or
transitions that have not yet been displayed via a call to TANGO_IMAGE
method :TAP_SHOW...

*** TANGO:WIDGET_CLASS Method :INPUT_COORD (TANGOinput_coord()):

(send <tango-widget> :INPUT_COORD)
==> on success, returns a COMPLEX FLONUM number #C(<x> <y>).
==> on failure, returns NIL.

This method prompts the user to select a coordinate from the animation
window. If a successful choice is made, the routine returns
#C(<x> <y>). If for some reason the selection was not successful
(e.g., the mouse selection was made outside <tango-widget>), the
routine returns NIL.

*** TANGO:WIDGET_CLASS Method :INPUT_IMAGE (TANGOinput_image()):

(send <tango-widget> :INPUT_IMAGE)
==> returns <tango_image> on success, NIL on failure

This routine prompts the user to select an image from <tango-widget>.
The user clicks down the mouse and this routine returns the uppermost
visible image object whose bounding box (with a little padding, hence
you can select vertical and horizontal lines) encloses the point of
the mouse selection. If a successful image choice is made, the
routine returns the TANGOIMAGEOBJ. If no image was selected, the
routine returns NIL. Be careful with lines; they often have big
bounding boxes. The :TX_RAISE and :TX_LOWER transitions are often
useful aids for inputting images.

*** TANGO:WIDGET_CLASS Method :GET_EVENT_IMAGE (TANGOget_event_image()):

(send <tango-widget> :GET_EVENT_IMAGE <xevent>)
==> returns <tango_image> on success, NIL on failure

<xevent> is typically taken from the CALLBACK_XEVENT or
EVHANDLER_XEVENT values set within widget-class methods
:SET_CALLBACK/:ADD_CALLBACK or :SET_EVHANDLER/:ADD_EVHANDLER.
<xevent> is used to determine the x,y location of a KeyPress,
KeyRelease, ButtonPress, ButtonRelease, MotionNotify, EnterNotify,
or LeaveNotify type event.

Note that if you use the TANGO:WIDGET_CLASS's :XMN_INPUT_CALLBACK
(set by :SET_CALLBACK/:ADD_CALLBACK method), you'll achieve the
semi-useless result of calling the callback function on all
ButtonPress, ButtonRelease, KeyPress, and KeyRelease events.
Instead, you should call the action procedure
Lisp(send ACTION_WIDGET :GET_EVENT_IMAGE ACTION_XEVENT)
from a translation table set-up on <tango-widget> by method
:OVERRIDE_TRANSLATIONS.

(defun printit (act-w act-e)
(print (send act-w :GET_EVENT_IMAGE act-e)))
(send <tango-widget> :override_translations
"<Btn1Down>,<Btn1Up>: Lisp(printit ACTION_WIDGET ACTION_XEVENT)")

One may also use standard event handlers without having to alter the
translation table. Use :SET_EVHANDLER/:ADD_EVHANDLER while specifying
the desired event-mask. (e.g. BUTTON_PRESS_MASK, BUTTON_RELEASE_MASK,
KEY_PRESS_MASK, KEY_RELEASE_MASK).

For example, the following event-handler flashes the tango-image
which was clicked via mouse, as specified by the event-mask
BUTTON_PRESS_MASK.

(send tango_w :set_event_handler BUTTON_PRESS_MASK
'(EVHANDLER_WIDGET EVHANDLER_XEVENT)
'(
(let ((timage (send EVHANDLER_WIDGET :get_event_image
EVHANDLER_XEVENT)))
(if timage
(send timage :tap_flash :perform 1)
))
))

*** TANGO:WIDGET_CLASS Method :GET_EVENT_COORD (TANGOget_event_coord()):

(send <tango-widget> :GET_EVENT_COORD <xevent>)
==> returns #C(<x> <y>) on success, NIL on failure

<xevent> is typically taken from the CALLBACK_XEVENT or
EVHANDLER_XEVENT values set within widget-class methods
:SET_CALLBACK/:ADD_CALLBACK or :SET_EVHANDLER/:ADD_EVHANDLER. <xevent>
is used to determine the x,y location of a KeyPress, KeyRelease,
ButtonPress, ButtonRelease, MotionNotify, EnterNotify, or
LeaveNotify type event.

See method :GET_EVENT_IMAGE above for other useage details.

*** TANGO:WIDGET_CLASS Method :LOAD_COLOR :

(send <tango-widget> :LOAD_COLOR <color-str>)
==> returns a FIXNUM representing a new TANGO_COLOR pixel
value.

<color-str> is a STRING name of a color, typically a name
from /usr/lib/X11/rgb.txt, e.g. "red". One may also specify a
hexadecimal value for the color, e.g. "#FF0000".

See also <<TANGO Colors (TANGO_COLOR):>> for details on
colors in Xtango.

*** TANGO:WIDGET_CLASS Method :SET_BGCOLOR (TANGOset_bgcolor()):

(send <tango-widget> :SET_BGCOLOR <color-str>)
==> returns NIL.

Method :SET_BGCOLOR sets the background color of <tango-widget>
to <color-str>. <color-str> is a STRING name of a color, typically
a name from /usr/lib/X11/rgb.txt, e.g. "red". One may also specify a
hexadecimal value for the color, e.g. "#FF0000".

*** TANGO:WIDGET_CLASS Method :GET_IMAGES :

(send <tango-widget> :GET_IMAGES [<visibility_kwd>])
==> returns a LIST of TANGOIMAGEOBJs.

[<visibility_kwd>] is an optional argument; if the argument is absent,
all the images are returned, both visible and invisible. If
:VISIBLE, then only visible images are returned; if :INVISIBLE,
then only invisible images are returned.

This method queries <tango-widget> returning the desired list
of TANGOIMAGEOBJs, instances of TANGO:IMAGE_CLASS. This
method can be used to save the set of images being displayed
by calling :COLORS_STOREON to save the colormap, followed by
calling :STOREON method on each image...

*** TANGO:WIDGET_CLASS Method :COLORS_STOREON :

(send <tango-widget> :COLORS_STOREON)
==> returns LIST of s-expressions representing calls to
method :LOAD_COLOR which when evaluated, recreates
the colormap of <tango-widget>.

An example of the output LIST from :COLORS_STOREON:
(
(SEND *TANGO_WIDGET* :LOAD_COLOR "black")
(SEND *TANGO_WIDGET* :LOAD_COLOR "maroon")
(SEND *TANGO_WIDGET* :LOAD_COLOR "red")
(SEND *TANGO_WIDGET* :LOAD_COLOR "orange")
(SEND *TANGO_WIDGET* :LOAD_COLOR "blue")
(SEND *TANGO_WIDGET* :LOAD_COLOR "green")
(SEND *TANGO_WIDGET* :LOAD_COLOR "yellow")
(SEND *TANGO_WIDGET* :LOAD_COLOR "white")
...
)

Note: this method should be used prior to 'eval'ing results of
:STOREON on any TANGO:IMAGE_CLASS subclasses. For an example
of using :COLOR_STOREON and :STOREON, see
<winterp-top-dir>/examples/xtango/cls-widget.lsp
which defines a subclass of TANGO:WIDGET_CLASS,
XTANGO-WIDGET-CLASS, and methods :SAVE-IMAGES and :LOAD-IMAGES.

*** TANGO:WIDGET_CLASS Method :COPY_TO_2D_BITMAP_ARRAY :

(send <tango-widget> :COPY_TO_2D_BITMAP_ARRAY <x> <y> <width> <height>)
==> returns ARRAY of TANGO_COLOR values of the form:
#(#( <0,0> ... <width-1,0> )
.
.
.
#( <0,height-1> ... <width-1,height-1>)
)

<x> <y> <width> and <height> are FLONUM's representing the area of
the <tango-widget> to copy into a 2D_BITMAP_ARRAY. The size of the
returned array is the integer size represented by those args.

USAGE: (send <tango-w> :COPY_TO_2D_BITMAP_ARRAY 0.0 0.0 1.0 1.0)
returns a bitmap representing all the images in <tango-w> (where
values 0.0,1.0 represent default initial :PAN/:ZOOM factors. To
reset <tango-widget> to defaults prior to calling this routine,
evaluate the following:
(send <tango-widget> :SET_COORD 0.0 1.0 1.0 0.0)

NOTE: you should 'eval' the results of :COLORS_STOREON prior to
creating a new bitmap image with the results of
:COPY_TO_2D_BITMAP_ARRAY.

** TANGO Images (TANGO_IMAGE):

The TANGOIMAGEOBJ is an object describing a particular
graphical image being displayed within a TANGO:WIDGET_CLASS
instance. In this implementation an image can be a line,
rectangle, circle, ellipse, polyline, polygon, spline,
bitmap, GIF, text, or a composite of the previous types.
Rectangles, circles, ellipses, and polygons can have varying fill
styles. Lines can have different thicknesses and styles. Currently,
this base set of images is limited to provide a simpler basis to
design animations.

The WINTERP interface to XTANGO allows programmers to use the XLISP
object system to create new images with new functionality and
encapsulated animation capabilities by subclassing and/or composing the
previously mentioned image types.

*** Function TANGO:IMAGEOBJP:

(TANGOIMAGEOBJP <expr>)
==> returns T if argument is a TANGOIMAGEOBJ, else NIL.

*** Function TANGO:TAP_EXCHANGE (TAPexchange()):

(TANGO:TAP_EXCHANGE [:PERFORM] <image-1> <image-2>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This function exchanges the positions of TANGOIMAGEOBJs
<image-1> and <image-2>. It is similar to TANGO:TAP_SWITCH,
however, it moves each image over a path of length 20 using
TANGO:PATH_MOTION, causing the positions to switch "smoothly".

*** Function TANGO:TAP_SWITCH (TAPswitch()):

(TANGO:TAP_SWITCH [:PERFORM] <image-1> <image-2>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This routine swaps two images; that is, <image-1> will acquire
<image-2>'s location and vice versa. The path that each image
follows has a length of one, so the two images will appear to "jump"
to their new locations. For a "smooth" version of this functionality,
see TANGO:TAP_EXCHANGE.

*** TANGO:IMAGE_CLASS -- the xtango image base class

All other WINTERP/Xtango image classes are subclasses of this class.

**** TANGO:IMAGE_CLASS method :NEW/:ISNEW :

TANGO:IMAGE_CLASS is not instantiable. An error will occur if
you try to instantiate this class. Subclasses of this class
are instantiable.

**** TANGO:IMAGE_CLASS method :EXISTS_P :

(send <tiobj> :EXISTS_P)
==> returns T if the TANGOIMAGEOBJ exists (hasn't been
destroyed)
==> returns NIL if the TANGOIMAGEOBJ has been destroyed
or has never been initialized.

**** TANGO:IMAGE_CLASS method :IMAGE_COPY (TANGOimage_copy()):

(send <tiobj> :IMAGE_COPY)
==> returns a TANGOIMAGEOBJ.

This method returns a new instance of TANGO:IMAGE_CLASS (or a
subclass thereof) which is an exact copy of the one given as a
parameter <tiobj> (at that instant in time). The new image will not
appear until a transition is performed, or until a :REFRESH message
is sent to the TANGO:WIDGET_CLASS instance in which the image
resides. This behavior is similar to other cases of TANGO:IMAGE_CLASS
instance creation (method :NEW).

**** TANGO:IMAGE_CLASS method :TX_MOVE (TANGO_TRANS_TYPE_MOVE):

(send <t-image-obj> :TX_MOVE [:PERFORM] [<path>])
==> returns <tango_trans> object, or NIL if :PERFORM given

The MOVE transition moves the given <t-image-obj> along the given
<path> (see below). The first movement of the image corresponds to
the first relative offset in the path. All these relative offsets are
with respect to the image's previous position on the screen.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.)
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:IMAGE_CLASS method :TX_VISIBLE (TANGO_TRANS_TYPE_VISIBLE):

(send <t-image-obj> :TX_VISIBLE [:PERFORM] [<path>])
==> returns <tango_trans> object, or NIL if :PERFORM given

The VISIBLE transition switches the visibility of the given
<t-image-obj> for each offset in the given <path>. At each offset in
the path, if the image is visible, it will become invisible, and
vice-versa. Note that the actual <x>,<y> offsets in the path are
ignored for this transition, therefore the optional <path> argument
could be ommitted (to create a "null" path of length 1) or a FIXNUM
(to create a "null" path of length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.)
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:IMAGE_CLASS method :TX_RAISE (TANGO_TRANS_TYPE_RAISE):

(send <t-image-obj> :TX_RAISE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RAISE transition brings the given <t-image-obj> to the viewing
plane closest to the viewer. The image's position is not changed,
only its relative ordering (top to bottom) with respect to other
images. Note that the actual <x>,<y> offsets in the path are ignored
for this transition, therefore the optional <path> argument could be
ommitted (to create a "null" path of length 1) or a FIXNUM (to create
a "null" path of length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:IMAGE_CLASS method :TX_LOWER (TANGO_TRANS_TYPE_LOWER):)

(send <t-image-obj> :TX_LOWER [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The LOWER transition pushes the given <t-image-obj> to the viewing
plane farthest from the viewer. The image's position is not changed,
only its relative ordering (top to bottom) with respect to other
images. It will possibly be obscured by every other image. Note that
the actual <x>,<y> offsets in the path are ignored for this
transition, therefore the optional <path> argument could be ommitted
(to create a "null" path of length 1) or a FIXNUM (to create a "null"
path of length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:IMAGE_CLASS method :TX_DELAY (TANGO_TRANS_TYPE_DELAY):

(send <t-image-obj> :TX_DELAY [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The DELAY transition creates a transition which has a null frame for
each offset in the path. By null frame, we mean that no action or
modification is performed. This transition is helpful when combined
with concatenation in order to produce actions that commence at
varying times. The image used in this transition does not matter.
Note that the actual <x>,<y> offsets in the path are ignored for this
transition, therefore the optional <path> argument could be ommitted
(to create a "null" path of length 1) or a FIXNUM (to create a "null"
path of length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:IMAGE_CLASS method :TX_REFRESH (TANGO_TRANS_TYPE_REFRESH):

(send <t-image-obj> :TX_REFRESH [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The REFRESH transition redraws the entire animation window, restoring
it to a pristine state. This is useful when running TANGO in fast
mode (non-total frame by frame refresh) and you would like to clean
up damage to the screen. A refresh is done for each offset in the
path, i.e., there's no need for more than one offset in the path.
The image used in this transition does not matter. Note that the
actual <x>,<y> offsets in the path are ignored for this transition,
therefore the optional <path> argument could be ommitted (to create a
"null" path of length 1) or a FIXNUM (to create a "null" path of
length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:IMAGE_CLASS method :TX_DELETE (TANGO_TRANS_TYPE_DELETE):

(send <t-image-obj> :TX_DELETE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The DELETE transition makes an image invisible (if not already) and
removes it from any possible later usage. Any attempts to use this
image as a parameter in subsequent TANGO calls will result in error
messages. Also, pre-existing transitions with this image as a
parameter should not be performed (they'll be ignored in
WINTERP). Note that the actual <x>,<y> offsets in the path are
ignored for this transition, therefore the optional <path> argument
may be ommitted, to create a "null" path of length 1.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:IMAGE_CLASS method :TX_ZOOM (TANGO_TRANS_TYPE_ZOOM):

(send <t-image-obj> :TX_ZOOM [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The ZOOM transition zooms the window in or out on the positional
location of the image argument <t-image-obj>. The <x> and <y>
components of a path element #C(<x> <y>) determine how the zooming
should occur. They should be between 0.0 and 1.0. Values close to
1.0 will zoom in very tight. Values near 0.0 do a slow zoom. To get
a nice slow, smooth zoom in on an object, use a path with quite a few
offsets all of equal ``small'' offset values, such as #C(0.1 0.1).
Positive offset values zoom the display in, negative offset values
pull the display back out.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:IMAGE_CLASS method :TAP_SHOW (TAPshow()):

(send <tiobj> :TAP_SHOW)
==> returns NIL

This method simply displays the <tiobj> (i.e. uses a delay transition
to display the object -- see method :TX_DELAY). Creating a
TANGO:IMAGE_CLASS instance will not cause the image to appear on the
display until until a subsequent animation occurs, therefore this
routine is useful for making sure that an image is properly displayed.

Note that including the optional :SHOW keyword during xtango
image creation does the equivalent of calling this function
after the tango image object gets created.

Note that if a large number of images are to be displayed, it is more
efficient to do a :REFRESH on the TANGO:WIDGET_CLASS instance after
all the images have been created. The same applies to using
the optional :SHOW keyword for image creation.

**** TANGO:IMAGE_CLASS method :TAP_FILL (TAPfill()):

(send <tiobj> :TAP_FILL [:PERFORM])
==> returns <tango_trans> object
or NIL if :PERFORM keyword given.

This method creates (and optionally :PERFORMs) the transition needed
to fill the given image to a solid color. The color being the
color specified during image creation, or the color specified
by a subsequent transition, caused by :TAP_COLOR or
:TX_COLOR. This method is similar to :TX_FILL, except that it
changes the fill value to 100%...

**** TANGO:IMAGE_CLASS method :TAP_COLOR (TAPcolor()):

(send <tiobj> :TAP_COLOR [:PERFORM] <tango-color>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

<tango-color> gives the color to which the image is changed when the
transition is performed. This method is a short-hand version of
:TX_COLOR. <tango-color> can either be a string color name (e.g.
"white" "black" "red" "orange" "yellow" "green" "blue" or "maroon".).

Alternately, <tango-color> can be a FIXNUM [0-7] representing the
tango-color pixel value. FIXNUM values for the standard Xtango colors
are specified via the constants TANGO_COLOR_WHITE, TANGO_COLOR_BLACK,
TANGO_COLOR_RED, TANGO_COLOR_ORANGE, TANGO_COLOR_YELLOW,
TANGO_COLOR_GREEN, TANGO_COLOR_BLUE, or TANGO_COLOR_MAROON.

Note that :TAP_COLOR, :TX_COLOR, and TANGO:PATH_COLOR only work with
the eight "basic" tango colors mentioned above. Using colors other
than the eight aforementioned colors, or using colors generated by
TANGO:WIDGET_CLASS method :LOAD_COLOR will signal an error.

**** TANGO:IMAGE_CLASS method :TAP_VIS_TOGGLE (TAPvis_toggle()):

(send <tiobj> :TAP_VIS_TOGGLE [:PERFORM])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This method creates (and optionally :PERFORMs) the transition needed
to toggle the visibility of <tiobj> and returns this transition.
This method is a short-hand version of method :TX_VISIBLE.

**** TANGO:IMAGE_CLASS method :TAP_JUMP (TAPjump()):

(send <tiobj> :TAP_JUMP [:PERFORM] <image_part_kwd> <location>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west
<location> is a COMPLEX FLONUM #C(<x> <y>) representing the x/y
coordinates of a location.

This method sets up a transition to move <tiobj> to the given
<location> using the specified <image_part_kwd> as a "handle." The
transition uses a path of length one, so essentially, the image will
appear to "jump" from its current location to the new location. The
necessary transition is returned.

**** TANGO:IMAGE_CLASS method :TAP_MOVE (TAPmove()):

(send <tiobj> :TAP_MOVE [:PERFORM] <image_part_kwd> <location>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west
<location> is a COMPLEX FLONUM #C(<x> <y>) representing the x/y
coordinates of a location.

This method sets up a transition to move <tiobj> from the location of
its indicated <image_part_kwd> to the given <location>. This method
is similar to method :TAP_JUMP; however, instead of using a path of
length one to create the transition, it uses TANGO:PATH_MOTION to
create the transition, which means that the path length is 20. The
required transition is returned.

**** TANGO:IMAGE_CLASS method :TAP_TRAVERSE (TAPtraverse()):

(send <tiobj> :TAP_TRAVERSE [:PERFORM]
<image_part_kwd>
<location>
<path_motion_kwd>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

<location> is a COMPLEX FLONUM #C(<x> <y>) representing the x/y
coordinates of a location.

<path_motion_kwd> is a keyword, either :STRAIGHT, :CLOCKWISE,
or :COUNTERCLOCKWISE.

This routine creates the transition necessary to move an object
(using the specified <image_part_kwd> of the object) from its current
position to <location>. The type of path that the object follows is
given by the parameter <path_motion_kwd>; <path_motion_kwd> is simply
a path type, i.e. it is of the same form as the path types for the
TANGO:PATH_MOTION routine.

**** TANGO:IMAGE_CLASS method :TAP_FLASH (TAPflash()):

(send <tiobj> :TAP_FLASH [:PERFORM] <num_flash_fixnum>)
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This method causes <tiobj> to toggle between visible and invisible
for the given number of times. This makes an object appear
to flash. This method is a short-hand version of method :TX_VISIBLE.

*** TANGO:BITMAP_IMAGE_CLASS (TANGO_IMAGE_TYPE_BITMAP)

**** TANGO:BITMAP_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:BITMAP_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<bitmap_array>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the bitmap image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where
<loc_x> is a FLONUM, typically [0.0 - 1.0] representing the X-axis
location; <loc_y> is a FLONUM, typically [0.0 - 1.0] representing the
Y-axis location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<bitmap_array> -- a 3-D array of FIXNUMs (TANGO_COLOR). Each FIXNUM
represents a Pixel (TANGO_COLOR) value. For example, a "movie"
consisting of 3 4x4 bitmaps is represented by the following:
#(#(#(1 1 1 1)
#(7 7 7 7)
#(7 7 7 7)
#(7 7 7 7))
#(#(7 7 7 1)
#(7 7 1 7)
#(7 1 7 7)
#(1 7 7 7))
#(#(7 7 7 1)
#(7 7 7 1)
#(7 7 7 1)
#(7 7 7 1)))

**** TANGO:BITMAP_IMAGE_CLASS method :STOREON

(send <bitmap-image> :STOREON)
==> returns list
(send TANGO:BITMAP_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y)
#( <bitmap-array-1> <bitmap-array-2> ... ))

See <<TANGO:BITMAP_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:BITMAP_IMAGE_CLASS method :TX_SHUFFLE

(send <bitmap-image> :TX_SHUFFLE [:PERFORM] [<path>])
==> returns <tango_trans> object, or NIL if :PERFORM keyword given

The SHUFFLE transition affects only the TANGO:BITMAP_IMAGE_CLASS. For
each offset in the <path> argument, the next 2-d bitmap in the image's
series will be displayed. The series is considered circular, i.e.,
the successor of the last bitmap is the first bitmap. This transition
is useful to get a certain effect such as a door opening. To do this,
define a BITMAP image with a series of individual bitmaps showing the
various stages of the door opening. Then run a SHUFFLE transition to
animate that occurrance. Note that the actual <x>,<y> offsets in the
path are ignored for this transition, therefore the optional <path>
argument could be ommitted (to create a "null" path of length 1) or a
FIXNUM (to create a "null" path of length of the FIXNUM).

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one
with both x and y offsets set to 0.0 is used as the path for
the transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as
the path for the transition to take. TANGO:PATH_CREATE, and
other TANGO:PATH_* functions return such TANGO_PATH typed
results;
* else, if <path> is of type FIXNUM, then a path of length
<path> with both x and y offsets set to 0.0 is used as the
path for the transition (see TANGOpath_null() in
doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then
a path of length one is used with x and y offsets set to <x>
and <y>.)
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX
#C(<x> <y>), then a path of the same length as the sequence
is created, with the x and y offsets set to the corresponding
<x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique paths.
"Simple cases" constitute paths which don't need to be be re-used, or
altered via calls to TANGO:PATH_* functions.

**** TANGO:BITMAP_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. Given that the
bitmap is a rectangular image, the locations specified by
<image_part_kwd> represent the actual boundaries of the image.

*** TANGO:CIRCLE_IMAGE_CLASS (TANGO_IMAGE_TYPE_CIRCLE):

**** TANGO:CIRCLE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:CIRCLE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<size_coord>
<tango_color>
<fill_float>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the circle image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where
<loc_x> is a FLONUM, typically [0.0 - 1.0] representing the X-axis
location; <loc_y> is a FLONUM, typically [0.0 - 1.0] representing the
Y-axis location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<size_coord> -- The radius of the circle image, COMPLEX or
FLONUM. If COMPLEX, then the 'realpart' is taken as the radius.
Type COMPLEX is accepted for this parameter for consistency
with TANGO:RECTANGLE_IMAGE_CLASS and TANGO:ELLIPSE_IMAGE_CLASS

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt.
See <<TANGO Colors (TANGO_COLOR):>> section above for details.

<fill_float> -- the fill value of the image, a FLONUM between
0.0 and 1.0. 0.0 corresponds to an unfilled outline and 1.0
corresponds to 100 per cent fill in the given color.
(Forty graduated fill styles are actually implemented.)

**** TANGO:CIRCLE_IMAGE_CLASS method :STOREON

(send <circle-image> :STOREON)
==> returns list
(send TANGO:CIRCLE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y)
<radius_float>
<tango_color>
<fill_float>)

See <<TANGO:CIRCLE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:CIRCLE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. Given that the
bitmap is a circle, the locations specified by
<image_part_kwd> represent the actual boundaries of the image.

**** TANGO:CIRCLE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:CIRCLE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. This transition alters the image's fill style value by
the <x> value of the offsets in <path>. The <x> value is simply
added to the existing fill value of <t-image-obj>, the <y> value is
ignored. If the image's fill value goes below 0.0, it is
automatically set back to 0.0. If it goes above 1.0, it is set back
to 1.0. Actually, the full range of values between 0.0 and 1.0 is
not available. We currently implement 40 different fills that range
between the two extremes.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:CIRCLE_IMAGE_CLASS method :TX_RESIZE (TANGO_TRANS_TYPE_RESIZE):

(send <t-image-obj> :TX_RESIZE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RESIZE transition resizes the given <t-image-obj> along the given
<path>. TANGO:CIRCLE_IMAGE_CLASS instances are resized by modifying
the circle's radius by the amount given in the <x> component of each
offset in the <path>. The <y> component of <path> is ignored.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:COMPOSITE_IMAGE_CLASS (TANGO_IMAGE_TYPE_COMPOSITE):

**** TANGO:COMPOSITE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:COMPOSITE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<class-specific-image-instance-creation-arg>
[<class-specific-image-instance-creation-arg>
...
[<class-specific-image-instance-creation-arg>]]
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the composite image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a FLONUM,
typically [0.0 - 1.0] representing the X-axis location; <loc_y> is a
FLONUM, typically [0.0 - 1.0] representing the Y-axis location. See
<<TANGO Locations and Coordinates (TANGO_LOC):>> section above.

[class-specific-image-instance-creation-arg> is a sequence of
arguments representing the image-class-specific data needed to create
an instance of the specified class, e.g.

TANGO:TEXT_IMAGE_CLASS #C(0.25 0.25) :ctr "text image class"
TANGO_COLOR_MAROON "6x13"

Each sequence [class-specific-image-instance-creation-args...] becomes
an element displayed in the composite image. The order, types and
numbers of parameters correspond to the arguments used in creating a
tango-image (see :NEW method descriptions for all the other subclasses
of TANGO:IMAGE_CLASS). For example, if some images were created with
the following code

(send TANGO:CIRCLE_IMAGE_CLASS :new :show tango_w
#C(0.25 0.25) 0.2 t TANGO_COLOR_MAROON 1.0)
(send TANGO:POLYGON_IMAGE_CLASS :new :show tango_w
#C(0.50 0.50) #C(0.10 0.10) #C(0.10 0.10)
"red" 1.0)

then you might use the following to create a composite image containing
the above images with the following call:

(send TANGO:COMPOSITE_IMAGE_CLASS :new
:show tango_w #C(0.25 0.25)
TANGO:CIRCLE_IMAGE_CLASS
#C(0.25 0.25) 0.2 TANGO_COLOR_MAROON 1.0
TANGO:POLYGON_IMAGE_CLASS
#C(0.50 0.50) #C(0.10 0.10)#C(0.10 0.10) "red" 1.0
)

**** TANGO:COMPOSITE_IMAGE_CLASS method :STOREON

(send <composite_image> :STOREON)
==> returns list of form
(send TANGO:COMPOSITE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y>)
[class-specific-image-instance-creation-args...]
[class-specific-image-instance-creation-args...]
...)

See <<TANGO:COMPOSITE_IMAGE_CLASS method :NEW/:ISNEW ...>> for details
on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:COMPOSITE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <composite_image> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
represent locations on the bounding box surrounding the set
of images contained in the TANGO:COMPOSITE_IMAGE_CLASS instance.

**** TANGO:COMPOSITE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <composite_image> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <composite_image> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list will generate
undefined results.

For composite images, method :TX_COLOR will apply :TX_COLOR
to all the subimages contained in the given composite image.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:COMPOSITE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <composite_image> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

This method alters the fill value of each subimage of <composite_image>
This will affect different subimage types differently:

For instances of TANGO:RECTANGLE_IMAGE_CLASS,
TANGO:CIRCLE_IMAGE_CLASS, TANGO:ELLIPSE_IMAGE_CLASS, and
TANGO:POLYGON_IMAGE_CLASS, this transition alters the image's fill
style value by the <x> value of the offsets in <path>. The <x> value
is simply added to the existing fill value of <composite_image>, the
<y> value is ignored. If the image's fill value goes below 0.0, it is
automatically set back to 0.0. If it goes above 1.0, it is set back
to 1.0. Actually, the full range of values between 0.0 and 1.0 is
not available. We currently implement 40 different fills that range
between the two extremes.

For instances of TANGO:LINE_IMAGE_CLASS, TANGO:POLYLINE_IMAGE_CLASS,
and TANGO:SPLINE_IMAGE_CLASS, the <x> value of each offset in <path>
is added to the line's <width> parameter value, and the <y> value is
added to the line's <style> parameter value (see the documentation
accompanying the :NEW method on the associated tango image classes
for further information on <width> and <style>). Extreme values are
reset to 0.0 and 1.0 as in rectangles and circles.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:COMPOSITE_IMAGE_CLASS method :TX_RESIZE (TANGO_TRANS_TYPE_RESIZE):

(send <composite_image> :TX_RESIZE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RESIZE transition resizes the given <composite_image> along the
given <path>. For composite images, a resize transition will be passed
on to all the subimages of <composite_image>, each handling resize
differently:
* TANGO:LINE_IMAGE_CLASS instances can have positive or
negative sizes, they are resized by altering the line's
size for each offset in the path.
* TANGO:RECTANGLE_IMAGE_CLASS instances can have only
positive sizes, so resizing a rectangle corresponds to
"dragging" the lower right corner of the rectangle along
the given path. If one of the rectangle's dimensions would
become negative, it is set to 0.
* TANGO:CIRCLE_IMAGE_CLASS instances are resized by modifying
the circle's radius by the amount given in the <x>
component of each offset in the <path>. The <y> component
of <path> is ignored.
* TANGO:ELLIPSE_IMAGE_CLASS instances are resized by adding
the <x> part of <path> value to the ellipse's <x> radius
and the <y> part of <path> to the <y> radius.
* other subimage types ignore :TX_RESIZE...

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:COMPOSITE_IMAGE_CLASS method :TX_RESIZE[1-7]:

(send <composite_image> :TX_RESIZE1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <composite_image> :TX_RESIZE7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

For <composite_image>, the transitions :TX_RESIZE1-:TX_RESIZE7 are
passed on to any subimages that are instances of instance of class
TANGO:POLYLINE_IMAGE_CLASS, TANGO:POLYGON_IMAGE_CLASS, or
TANGO:SPLINE_IMAGE_CLASS. The transitions :TX_RESIZE1-:TX_RESIZE7
modify the relative positions of the respective vertex number, plus
all others after it in numerical order, by the relative <x> <y>
offsets of <path>. These transitions are useful, for example, with a
forward arrow polyline that has many of its edges compressed down to
start. They can subsequently be grown out in all different
directions, one at a time.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:COMPOSITE_IMAGE_CLASS method :TX_GRAB[1-7]:

(send <composite_image> :TX_GRAB1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <composite_image> :TX_GRAB7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

For <composite_image>, the transitions :TX_GRAB1-:TX_GRAB7 are passed
on to any subimages that are instances of instance of class
TANGO:POLYLINE_IMAGE_CLASS, TANGO:POLYGON_IMAGE_CLASS, or
TANGO:SPLINE_IMAGE_CLASS. The transitions :TX_GRAB1-:TX_GRAB7 modify
the relative position of a particular vertex on the image (except the
one denoting the image's position) by the relative offsets of the
path. As opposed to :TX_RESIZE[1-7], the transitions :TX_GRAB[1-7]
alter only one particular vertex in the image's definition. Think of
grabbing that vertex and swinging it around while all the other
points stay anchored.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:ELLIPSE_IMAGE_CLASS (TANGO_IMAGE_TYPE_ELLIPSE):

**** TANGO:ELLIPSE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:ELLIPSE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<size_coord>
<tango_color>
<fill_float>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the ellipse image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<size_coord> -- The size of the ellipse image, a COMPLEX number of
form #C(<size_x> <size_y>), where <size_x> is a FLONUM, typically
[0.0 - 1.0] representing the X-axis radius; <size_y> is a FLONUM,
typically [0.0 - 1.0] representing the Y-axis radius.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<fill_float> -- the fill value of the image, a FLONUM between 0.0 and
1.0. 0.0 corresponds to an unfilled outline and 1.0 corresponds to
100 per cent fill in the given color. (Forty graduated fill styles
are actually implemented.)

**** TANGO:ELLIPSE_IMAGE_CLASS method :STOREON

(send <ellipse-image> :STOREON)
==> returns list
(send TANGO:ELLIPSE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y)
#C(<radius-x> <radius-y>)
<tango_color>
<fill_float>)

See <<TANGO:ELLIPSE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:ELLIPSE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
represent locations on the bounding box of the ellipse.

**** TANGO:ELLIPSE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:ELLIPSE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. This transition alters the image's fill style value by
the <x> value of the offsets in <path>. The <x> value is simply
added to the existing fill value of <t-image-obj>, the <y> value is
ignored. If the image's fill value goes below 0.0, it is
automatically set back to 0.0. If it goes above 1.0, it is set back
to 1.0. Actually, the full range of values between 0.0 and 1.0 is
not available. We currently implement 40 different fills that range
between the two extremes.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:ELLIPSE_IMAGE_CLASS method :TX_RESIZE (TANGO_TRANS_TYPE_RESIZE):

(send <t-image-obj> :TX_RESIZE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RESIZE transition resizes the given <t-image-obj> along the given
<path>. TANGO:ELLIPSE_IMAGE_CLASS instances are resized by adding the
<x> part of <path> value to the ellipse's <x> radius and the <y> part
of <path> to the <y> radius.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:GIF_IMAGE_CLASS (TANGO_IMAGE_TYPE_PIXMAP):

**** TANGO:GIF_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:GIF_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<gif_file_name>
[:VERBOSE|:NOVERBOSE]
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<gif_file_name> -- a STRING, the full path to the GIF file.

[:VERBOSE|:NOVERBOSE] -- optional keyword. If :NOVERBOSE or
no argument passed, information on the GIF is not printed.
If :VERBOSE argument passed, then information on the size of
the GIF, number of colors allocated exactly and number of colors
approximated, is printed to stdout.

Note: GIF colormaps are allocated exactly if your global colormap has
enough free colors. If not, then it attempts to substitute the
closest fit of colors from the global colormap. For the applications
the author has considered, it was decided not to allocate a private
colormap for GIF images so that exact colors could be achieved on an
8 bit system. This is because the GIF image is just one image among
many other tango images and Motif widgets that need to share a
colormap. For such situations, having the system colors go
"technicolor" in order to display GIF colors exactly was deemed
inappropriate... (Yes, there are solutions for this, but at the
current time, they are not portable across platforms).

Automatic memory/resource management note: colors allocated for a
particular GIF image are deallocated when the GIF image is
:TX_DELETE'd or when the TANGO:WIDGET_CLASS instance displaying the
GIF image gets destroyed. Likewise, the GIF data is also destroyed.
If you are running out of colors, you may find that you can reclaim
colors by explicitly destroying the image and forcing a garbage
collect. Likewise, if you are running out of client-side or
server-side memory, you will aslo want to destroy uneeded images.
Here's what you need to do:
(send <gif-image> :tx_delete :perform)
(gc)

**** TANGO:GIF_IMAGE_CLASS method :STOREON

TODO: This method still needs to be implemented! (Sorry...)

**** TANGO:GIF_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. Given that the
GIF is a rectangular image, the locations specified by
<image_part_kwd> represent the actual boundaries of the image.

*** TANGO:LINE_IMAGE_CLASS (TANGO_IMAGE_TYPE_LINE):

**** TANGO:LINE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:LINE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<size_coord>
<tango_color>
<line_width_float>
<line_style>
<arrow_kwd>)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<size_coord> -- a COMPLEX number of form #C(<size-x> #<size-y>)
where <size-x> represents the x-offset and <size-y> represents
the y-offset of line/arrow destination; the source being at
<location_coor>. Line sizes can be either positive or negative.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<line_width_float> -- defines the width of the line; it can range
from 0.0 to 1.0 (corresponding roughly to percentages). 0.0
corresponds to a thin line, and 1.0 corresponds to the thickest line.
Currently, we have implemented three thicknesses that are achieved by
values in the range 0.0 to 0.333, 0.333 to 0.667, and 0.667 to 1.0,
respectively.

<line_style> -- defines the line's style. It ranges from 0.0 to 1.0
also. We have implemented three styles: 0.0 to 0.333 defines a dotted
line, 0.333 to 0.667 defines a dashed line, and 0.667 to 1.0 defines a
solid line.

<arrow_kwd> -- one of the following keywords :NO_ARROW, :FORW_ARROW,
:BACK_ARROW, or :BOTH_ARROW .

**** TANGO:LINE_IMAGE_CLASS method :STOREON

(send <line-image> :STOREON)
==> returns list
(send TANGO:LINE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y)
#C(<size-x> <size-y>)
<tango_color>
<line_width_float>
<line_style>
<arrow-kwd>)

See <<TANGO:LINE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:LINE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
represent locations on the bounding box of the line.

**** TANGO:LINE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:LINE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. For line images, this method takes the <x> value of each
offset in <path> and adds it to the line's <width> parameter value;
the <y> value is added to the line's <style> parameter value (see
<<TANGO:LINE_IMAGE_CLASS method :NEW (TANGOimage_create()):>> for
information on <line_width_float> and <line_style>. Extreme values
are reset to 0.0 and 1.0 as in rectangles and circles.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:LINE_IMAGE_CLASS method :TX_RESIZE (TANGO_TRANS_TYPE_RESIZE):

(send <t-image-obj> :TX_RESIZE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RESIZE transition resizes the given <t-image-obj> along the given
<path>. For TANGO:LINE_IMAGE_CLASS instances the path elements can
have positive or negative sizes; Line images are resized by altering
the line's size for each offset in the path.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:POLYGON_IMAGE_CLASS (TANGO_IMAGE_TYPE_POLYGON):

**** TANGO:POLYGON_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:POLYGON_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<fill_float>)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<vertex-offset-coord-N> -- for i=0 to 6, this represents a COMPLEX
number of form #C(<offset-x> #<offset-y>) where <offset-x> represents
the x-offset and <offset-y> represents the y-offset of the polygon
vertex from its <location_coor>. These offsets can be either
positive or negative. Xtango polygon images support polygons with
eight or less sides. Therefore the sequence of offsets must be <= 7
elements -- the first vertex is implicity <0,0> and is not to be
included in the sequence.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<fill_float> -- the fill value of the image, a FLONUM between 0.0 and
1.0. 0.0 corresponds to an unfilled outline and 1.0 corresponds to
100 per cent fill in the given color. (Forty graduated fill styles
are actually implemented.)

**** TANGO:POLYGON_IMAGE_CLASS method :STOREON

(send <tango_polygon_image> :STOREON)
==> returns list
(send TANGO:POLYGON_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<fill_float>)

See <<TANGO:POLYGON_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:POLYGON_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tango_polygon_image> :IMAGE_LOC <image_part>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and
<y> are FLONUMS representing the location of the image.

<image_part> is either a KEYWORD SYMBOL or FIXNUM [0-7]
0 -- the "location", aka, the 0th vertex.
1 -- the 1st vertex
... ...
7 -- the 7th vertex

:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part> of the given
<tango_polygon_image>. Valid <image_part> include :CTR (center),
and the compass directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
locations represent points on the bounding box of the polygon. If
<image_part> is a FIXNUM [0..7], then the location returned is the
actual location of the vertex, where vertex 0 is <location_coord> and
vertex 1 thru 7 represent the locations of the other vertices.

**** TANGO:POLYGON_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:POLYGON_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. This transition alters the image's fill style value by
the <x> value of the offsets in <path>. The <x> value is simply
added to the existing fill value of <t-image-obj>, the <y> value is
ignored. If the image's fill value goes below 0.0, it is
automatically set back to 0.0. If it goes above 1.0, it is set back
to 1.0. Actually, the full range of values between 0.0 and 1.0 is
not available. We currently implement 40 different fills that range
between the two extremes.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:POLYGON_IMAGE_CLASS method :TX_RESIZE[1-7]:

(send <polygon_image> :TX_RESIZE1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <polygon_image> :TX_RESIZE7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_RESIZE1-:TX_RESIZE7 modify the relative
positions of the respective vertex number, plus all others after it
in numerical order, by the relative <x> <y> offsets of <path>.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:POLYGON_IMAGE_CLASS method :TX_GRAB[1-7]:

(send <polygon_image> :TX_GRAB1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <polygon_image> :TX_GRAB7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_GRAB1-:TX_GRAB7 modify the relative position of
a particular vertex on the image (except the one denoting the image's
position) by the relative offsets of the path. As opposed to
:TX_RESIZE[1-7], the transitions :TX_GRAB[1-7] alter only one
particular vertex in the image's definition. Think of grabbing that
vertex and swinging it around while all the other points stay anchored.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:POLYLINE_IMAGE_CLASS (TANGO_IMAGE_TYPE_POLYLINE):

**** TANGO:POLYLINE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:POLYLINE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<line_width_float>
<line_style>
<arrow_kwd>)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<vertex-offset-coord-N> -- for i=0 to 6, this represents a COMPLEX
number of form #C(<offset-x> #<offset-y>) where <offset-x> represents
the x-offset and <offset-y> represents the y-offset of the polyline
vertex from its <location_coor>. These offsets can be either
positive or negative. Xtango polyline images support polylines with
eight or less sides. Therefore the sequence of offsets must be <= 7
elements -- the first vertex is implicity <0,0> and is not to be
included in the sequence.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<line_width_float> -- defines the width of the polyline; it can range
from 0.0 to 1.0 (corresponding roughly to percentages). 0.0
corresponds to a thin line, and 1.0 corresponds to the thickest line.
Currently, we have implemented three thicknesses that are achieved by
values in the range 0.0 to 0.333, 0.333 to 0.667, and 0.667 to 1.0,
respectively.

<line_style> -- defines the line's style. It ranges from 0.0 to 1.0
also. We have implemented three styles: 0.0 to 0.333 defines a dotted
line, 0.333 to 0.667 defines a dashed line, and 0.667 to 1.0 defines a
solid line.

<arrow_kwd> -- one of the following keywords :NO_ARROW, :FORW_ARROW,
:BACK_ARROW, or :BOTH_ARROW .

**** TANGO:POLYLINE_IMAGE_CLASS method :STOREON

(send <tango_polyline_image> :STOREON)
==> returns list
(send TANGO:POLYLINE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<line_width_float>
<line_style>
<arrow_kwd>)

See <<TANGO:POLYLINE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:POLYLINE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tango_polyline_image> :IMAGE_LOC <image_part>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image.

<image_part> is either a KEYWORD SYMBOL or FIXNUM [0-7]
0 -- the "location", aka, the 0th vertex.
1 -- the 1st vertex
... ...
7 -- the 7th vertex

:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part> of the given
<tango_polyline_image>. Valid <image_part> include :CTR (center),
and the compass directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
locations represent points on the bounding box of the polyline. If
<image_part> is a FIXNUM [0..7], then the location returned is the
actual location of the vertex, where vertex 0 is <location_coord> and
vertex 1 thru 7 represent the locations of the other vertices.

**** TANGO:POLYLINE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:POLYLINE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. For polyline images, this method takes the <x> value of
each offset in <path> and adds it to the polyline's <line_width_float>
parameter value; the <y> value is added to the polyline's <line_style>
parameter value (see
<<TANGO:POLYLINE_IMAGE_CLASS method :NEW (TANGOimage_create()):>>
for information on <line_width_float> and <line_style>. Extreme
values are reset to 0.0 and 1.0 as in rectangles and circles.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:POLYLINE_IMAGE_CLASS method :TX_RESIZE[1-7]:

(send <polyline_image> :TX_RESIZE1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <polyline_image> :TX_RESIZE7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_RESIZE1-:TX_RESIZE7 modify the relative
positions of the respective vertex number, plus all others after it
in numerical order, by the relative <x> <y> offsets of <path>.
These transitions are useful, for example, with a forward arrow
polyline that has many of its edges compressed down to start.
They can subsequently be grown out in all different directions, one
at a time.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:POLYLINE_IMAGE_CLASS method :TX_GRAB[1-7]:

(send <polyline_image> :TX_GRAB1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <polyline_image> :TX_GRAB7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_GRAB1-:TX_GRAB7 modify the relative position of
a particular vertex on the image (except the one denoting the image's
position) by the relative offsets of the path. As opposed to
:TX_RESIZE[1-7], the transitions :TX_GRAB[1-7] alter only one
particular vertex in the image's definition. Think of grabbing that
vertex and swinging it around while all the other points stay anchored.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:RECTANGLE_IMAGE_CLASS (TANGO_IMAGE_TYPE_RECTANGLE):

**** TANGO:RECTANGLE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:RECTANGLE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<size_coord>
<tango_color>
<fill_float>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the rectangle
image, corresponds to the upper left corner. <location_coord> is
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<size_coord> -- The size of the rectangle image, a COMPLEX number of
form #C(<size_x> <size_y>), where <size_x> is a FLONUM, typically
[0.0 - 1.0] representing the X-axis size; <size_y> is a FLONUM,
typically [0.0 - 1.0] representing the Y-axis size.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<fill_float> -- the fill value of the image, a FLONUM between 0.0 and
1.0. 0.0 corresponds to an unfilled outline and 1.0 corresponds to
100 per cent fill in the given color. (Forty graduated fill styles
are actually implemented.)

**** TANGO:RECTANGLE_IMAGE_CLASS method :STOREON

(send <rectangle-image> :STOREON)
==> returns list
(send TANGO:RECTANGLE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y)
#C(<size-x> <size-y>)
<tango_color>
<fill_float>)

See <<TANGO:RECTANGE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:RECTANGLE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
locations represent the actual boundaries of the rectangle.

**** TANGO:POLYLINE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:RECTANGLE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. This transition alters the image's fill style value by
the <x> value of the offsets in <path>. The <x> value is simply
added to the existing fill value of <t-image-obj>, the <y> value is
ignored. If the image's fill value goes below 0.0, it is
automatically set back to 0.0. If it goes above 1.0, it is set back
to 1.0. Actually, the full range of values between 0.0 and 1.0 is
not available. We currently implement 40 different fills that range
between the two extremes.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:RECTANGLE_IMAGE_CLASS method :TX_RESIZE (TANGO_TRANS_TYPE_RESIZE):

(send <t-image-obj> :TX_RESIZE [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The RESIZE transition resizes the given <t-image-obj> along the given
<path>. TANGO:RECTANGLE_IMAGE_CLASS instances are resized by adding the
<x> part of <path> value to the rectangle's <x> size and the <y> part
of <path> to the <y> size. Rectangles can have only positive sizes,
so resizing a rectangle corresponds to "dragging" the lower right
corner of the rectangle along the given path. If one of the rectangle's
dimensions would become negative, it is set to 0.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:SPLINE_IMAGE_CLASS (TANGO_IMAGE_TYPE_SPLINE):

**** TANGO:SPLINE_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:SPLINE_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<line_width_float>
<line_style>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS.

<location_coord> -- the location for placing the image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where <loc_x> is a
FLONUM, typically [0.0 - 1.0] representing the X-axis location;
<loc_y> is a FLONUM, typically [0.0 - 1.0] representing the Y-axis
location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

<vertex-offset-coord-N> -- for i=0 to 6, this represents a COMPLEX
number of form #C(<offset-x> #<offset-y>) where <offset-x> represents
the x-offset and <offset-y> represents the y-offset of the spline
vertex from its <location_coor>. These offsets can be either
positive or negative. Xtango spline images support splines with
eight or less vertices. Therefore the sequence of offsets must be <= 7
elements -- the first vertex is implicity <0,0> and is not to be
included in the sequence.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<line_width_float> -- defines the width of the spline; it can range
from 0.0 to 1.0 (corresponding roughly to percentages). 0.0
corresponds to a thin line, and 1.0 corresponds to the thickest line.
Currently, we have implemented three thicknesses that are achieved by
values in the range 0.0 to 0.333, 0.333 to 0.667, and 0.667 to 1.0,
respectively.

<line_style> -- defines the line's style. It ranges from 0.0 to 1.0
also. We have implemented three styles: 0.0 to 0.333 defines a dotted
line, 0.333 to 0.667 defines a dashed line, and 0.667 to 1.0 defines a
solid line.

**** TANGO:SPLINE_IMAGE_CLASS method :STOREON

(send <tango_spline_image> :STOREON)
==> returns list
(send TANGO:SPLINE_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
<location_coord>
<vertex-offset-coord-0>
[<vertex-offset-coord-1> [<vertex-offset-coord-2>
...
[<vertex-offset-coord-N>]]]
<tango_color>
<line_width_float>
<line_style>
)

See <<TANGO:SPLINE_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:SPLINE_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tango_spline_image> :IMAGE_LOC <image_part>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image.

<image_part> is either a KEYWORD SYMBOL or FIXNUM [0-7]
0 -- the "location", aka, the 0th vertex.
1 -- the 1st vertex
... ...
7 -- the 7th vertex

:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part> of the given
<tango_spline_image>. Valid <image_part> include :CTR (center),
and the compass directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
locations represent points on the bounding box of the spline. If
<image_part> is a FIXNUM [0..7], then the location returned is the
actual location of the vertex, where vertex 0 is <location_coord> and
vertex 1 thru 7 represent the locations of the other vertices.

**** TANGO:SPLINE_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

**** TANGO:SPLINE_IMAGE_CLASS method :TX_FILL (TANGO_TRANS_TYPE_FILL):

(send <t-image-obj> :TX_FILL [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The FILL transition changes the "fill" component of the given image
<t-image-obj>. For spline images, this method takes the <x> value of
each offset in <path> and adds it to the spline's <line_width_float>
parameter value; the <y> value is added to the spline's <line_style>
parameter value
(see <<TANGO:POLYLINE_IMAGE_CLASS method :NEW (TANGOimage_create()):>>
for information on <line_width_float> and <line_style>. Extreme
values are reset to 0.0 and 1.0 as in rectangles and circles.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:SPLINE_IMAGE_CLASS method :TX_RESIZE[1-7]:

(send <spline_image> :TX_RESIZE1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <spline_image> :TX_RESIZE7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_RESIZE1-:TX_RESIZE7 modify the relative
positions of the respective vertex number, plus all others after it
in numerical order, by the relative <x> <y> offsets of <path>.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:

* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

**** TANGO:SPLINE_IMAGE_CLASS method :TX_GRAB[1-7]:

(send <spline_image> :TX_GRAB1 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.
.
.
.
(send <spline_image> :TX_GRAB7 [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The transitions :TX_GRAB1-:TX_GRAB7 modify the relative position of
a particular vertex on the image (except the one denoting the image's
position) by the relative offsets of the path. As opposed to
:TX_RESIZE[1-7], the transitions :TX_GRAB[1-7] alter only one
particular vertex in the image's definition. Think of grabbing that
vertex and swinging it around while all the other points stay anchored.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

The [<path>] argument is optional, and may be of multiple types:
* if the <path> argument is omitted, then a path of length one with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type TANGO_PATH, then that is used as the path
for the transition to take. TANGO:PATH_CREATE, and other
TANGO:PATH_* functions return such TANGO_PATH typed results;
* else, if <path> is of type FIXNUM, then a path of length <path> with
both x and y offsets set to 0.0 is used as the path for the
transition (see TANGOpath_null() in doc/xtangodoc.tex);
* else, if <path> is of type COMPLEX (e.g. #C(<x> <y>), then a path of
length one is used with x and y offsets set to <x> and <y>.
* else, if <path> is a sequence (LIST or ARRAY) of COMPLEX #C(<x> <y>),
then a path of the same length as the sequence is created,
with the x and y offsets set to the corresponding <x> <y>.

Note: all <path> arg types other than TANGO_PATH are used here for
convenience in creating transitions over simple, unique
paths. "Simple cases" constitute paths which don't need to be be
re-used, or altered via calls to TANGO:PATH_* functions.

*** TANGO:TEXT_IMAGE_CLASS (TANGO_IMAGE_TYPE_TEXT):

**** TANGO:TEXT_IMAGE_CLASS method :NEW/:ISNEW (TANGOimage_create()):

(send TANGO:TEXT_IMAGE_CLASS :new
[:show] [<visible_kwd>] <tango_widget>
<location_coord> [:CTR]
<text_str>
<tango_color>
<font_str>
)
==> RETURNS an <tango_image> object.

[:show] -- OPTIONAL :show keyword. If present, displays image
immediately, else the image will be displayed along with the next
animation frame. See :TAP_SHOW :TX_DELAY.

[<visible_kwd>] -- OPTIONAL :VISIBLE or :INVISIBLE keyword. If
omitted, :VISIBLE is assumed. See also :TX_VISIBLE, :TAP_VIS_TOGGLE.

<tango_widget> -- an instance of TANGO:WIDGET_CLASS

<location_coord> -- the location for placing the text image. A
COMPLEX number, of form #C(<loc_x> <loc_y>), where
<loc_x> is a FLONUM, typically [0.0 - 1.0] representing the X-axis
location; <loc_y> is a FLONUM, typically [0.0 - 1.0] representing the
Y-axis location. See <<TANGO Locations and Coordinates (TANGO_LOC):>>
section above.

[:CTR] -- an optional KEYWORD. If this keyword is supplied,
then <location_coord> above refers to the center of the text image.
If :CTR keyword not supplied, then <location_coord> refers
to the lower left corner of the text image.

<text_string> is the text to be displayed by the the tango image.
Special characters such as tab, newline, carriage-return, etc
are rendered by the associated character specified by <font_string>
rather than tabbing, or starting a new line of text. See
"note" below for hints on creating multiline text.

<tango_color> -- The color of the image; it can either be a string
color name, or a FIXNUM representing the tango pixel value. If given
a string, it is looked up in the X11 file /usr/lib/X11/rgb.txt. See
<<TANGO Colors (TANGO_COLOR):>> section above for details.

<font_string> a STRING representing the font used for drawing.
If the value of <font_string> is NIL, then Xtango's default
font is used.

NOTE: to display multi-line text, one might consider using function
below to render the multiline text string <str> via multiple
text images stored as a composite image containing multiple
single-line text images. (Probably makes more sense to create
a new class TANGO:MULTILINE_TEXT_IMAGE_CLASS, feel free to
use the code below as a starting point...):

(require "xtango/cls-image")
(require "xtango/cls-widget")

;; for each line of text, create a TANGO:TEXT_IMAGE_CLASS
;; if multiple lines of text, group all the images
;; into one composite image
(defun create-multiline-text-image (str location_coord
tango_color font_string)
(let (pos
(imgs '())
)
(loop
(setq pos (search "\n" str))
(setq imgs
(cons
(send TANGO:TEXT_IMAGE_CLASS :new :show tango_w
location_coord
(subseq str 0 pos) ;text_string
tango_color
font_string
)
imgs))
(if (null pos) (return))
(setq str
(subseq str (1+ pos) nil))
(setq coords
(+ coords (- (send (car imgs) :IMAGE_LOC :s)
(send (car imgs) :IMAGE_LOC :n))))
)
(if (> (length imgs) 1)
(progn ;group multiline text into one object
(send tango_w :set-multi-selected-images imgs)
(send tango_w :group-selected-images)
)
(send tango_w :set-selected-image (car imgs)))
)
)

**** TANGO:TEXT_IMAGE_CLASS method :STOREON

(send <text-image> :STOREON)
==> returns list
(send TANGO:TEXT_IMAGE_CLASS :new <visibility_kwd>
*TANGO_WIDGET*
#C(<location-x> <location-y) [:ctr]
<text_str>
<tango_color>
<font_str>)

See <<TANGO:TEXT_IMAGE_CLASS method :NEW/:ISNEW...>>
for details on the returned data.

Evaluating the results of this method will create a copy of the given
image at a later time. Printing the results of this method to a file
enables one to store a persistent copy of the given image to
disk. See also TANGO:WIDGET_CLASS method :GET_IMAGES and
:COLORS_STOREON.

**** TANGO:TEXT_IMAGE_CLASS method :IMAGE_LOC (TANGOimage_loc()):

(send <tiobj> :IMAGE_LOC <image_part_kwd>)
==> returns a COMPLEX number #C(<x> <y>), where <x> and <y>
are FLONUMS representing the location of the image

<image_part_kwd> is a keyword argument, one of:
:CTR -- center
:NW -- north west
:NE -- north east
:E -- east
:SE -- south east
:S -- south
:SW -- south west
:W -- west

This routine returns a COMPLEX FLONUM #C(<x> <y>) that corresponds to
the location of the given <image_part_kwd> of the given <tiobj>.

Valid <image_part_kwd> include :CTR (center), and the compass
directions :NW, :N, :NE, :E, :SE, :S, :SW, :W. These
represent locations on the bounding box of the text.

**** TANGO:TEXT_IMAGE_CLASS method :TX_COLOR (TANGO_TRANS_TYPE_COLOR):

(send <t-image-obj> :TX_COLOR [:PERFORM] [<path>])
==> returns <tango_trans> object,
or NIL if :PERFORM keyword given.

The COLOR transition changes the given <t-image-obj> to the color
indicated by the given <path>. See the routine TANGO:PATH_COLOR to
create a special path which will change the image to a certain
color. Using an arbitrary TANGO_PATH type argument, or using one of
the other alternatives for the <path> argument list (as used
in other :TX_* methods) will generate undefined results.

The optional :PERFORM keyword argument specifies that the transition
is to be performed immediately (see TANGO:TRANS_PERFORM). If :PERFORM
is omitted, then a <tango_trans> object is returned (useful for
storing- or operating-on- complex transitions via TANGO:TX_ITERATE,
TANGO:TX_CONCATENATE, TANGO:TX_COMPOSE.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
= Niels Mayer ..... mayer@eit.com .... http://www.eit.com/people/mayer.html =
= Multimedia Engineering Collaboration Environment (MM authoring for WWW) =
= Enterprise Integration Technologies, 459 Hamilton Ave, Palo Alto CA 94301 =
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=