hum(1)                        ROTANG                       hum(1)



NAME
       hum - A multithreaded multipipelined movie player

SYNOPSIS
       hum [-options ...] [filename ...]

       hum -h             List of options and their defaults

DESCRIPTION
       hum  displays  images  or  animates frames of a movie, and
       allows the user to pan and zoom using the mouse.   hum  is
       designed  to  fully utilize multi-processor graphics work-
       stations, but still work well on small  PCs.   hum  imple-
       ments  a  pipeline  model  to  overlap the time performing
       input, uncompressing, decoding, and displaying  an  image,
       speculative  prefetches  frames, and stores decoded images
       in a least recently used replacement  cache  with  pending
       and previous references counters.

       The  left  mouse button moves the image, the middle button
       zooms in and out.  The right button moves the probe, whose
       position  is  displayed  in transient probe GUI tile.  The
       individual GUI tiles are described preceeding the  set  of
       arguments associated with that GUI tile.

       Each  GUI  tile  has an eight section border (Bottom Left,
       Left, Top Left, Top Middle, Top Right, ...) which  may  be
       clicked  on.   The sections indicate restricted tile move-
       ment (left button) or  resizing  (middle  button)  to  the
       respective  edges  and axes of the GUI tile or icon.   The
       right mouse button iconifies the tile, or de-iconifies  an
       icon.   The  iconic  state of the GUI tiles may be toggled
       using the keyboard:

       Shft/Ctrl/Meta Invert the control linking state (-link)

       Esc            Quit

       Return         Re-center image and set zoom to fit window

       Space          Start/Stop animation

       A              Toggle display of per-frame annotation (-f)

       C              Close this window

       D              Toggle don't raster -- draw rectangle frame

       G              Toggle display of the entire GUI

       H              Print a list of the these keys

       L              Toggle control linking between windows.

       O              Open a new window on this screen

       P              Toggle pipes and cache status displays

       Q              Quit

       R              Toggle rate throttle and display rate stats

       T              Toggle display of the series title (-title)

       W              Toggle image wrapping

       0-9            Open a new window on screen number 0-9

       \              Print the pipelines and cache states

       Up/Down        Forward/backward one frame

       Left/Right     Switch between left, left  and  right,  and
       right components


       Delete/BS      Reset frame number to first frame (-framen)


       NOTE:  Window  manager  settings  may   "steal"   modifier
       (shift/control/meta) keystrokes and/or mouse events, caus-
       ing your window manager to react to input events  intended
       for hum.  Refer to your window manager's manpage.


OPTIONS
       -h      A  list  of  all  the arguments hum knows, a brief
               description, the type, and the default value(s).

       -f filename
               Load the list of filenames (with optional  annota-
               tion)  from  a file.  If multiple -f arguments are
               used, the frames are appended.  File format is one
               frame per line, specifying left, right, and vector
               filenames, and annotation using the key-value pair
               notation:

            F = Image filename

            L = Left image filename

            R = Right image filename

            V = Vector data

            C = Colormap filename (may appear on any line or on a
       line by itself)

            # Comment until end of line

            A = Per-frame annotation

       The annotation is always optional, but must appear last if
       it  is  used.   This  syntax  affords arbitrary annotation
       without keyword conflict.  Other options may appear in any
       order.

       c=fname   |   [FL]=fname   [R=fname]  [v=fname]  [c=fname]
       [a=annotation] [# comment]



       -sched 
               Request threads to be scheduled  with  process  or
               system scope contention.

       -reverse_scroll
               Causes  images  to  pan  in  opposite direction of
               mouse motions.

       -fullscreen
               Create windows  without  border  decorations  that
               occupy  the  entire  screen.   When  used with the
               -panorama option, images are scaled  to  fill  the
               overall display, not just the current window.

       -nscreens n
               Open windows starting on the default screen, and n
               - 1 subsequent screens at startup.

       -framen frame number
               Frame number to start animation at (starting  with
               0, not 1)

       -queue n
               Number  of  frames  to queue for pipelines.  Queue
               asynchronously issues work to pipelines.

       -ninst n
               The number of windows to pop-up on each screen  at
               startup.

       -ntiles n n
               Number  of  image  tiles in the X and Y dimensions
               respectively.

       -link   Propogate input events to all windows  by  linking
               controls across all windows (also 'L' key).

       -pixel_ratio float
               Height/Width pixel aspect ratio on the screen.

       -zoom float
               Initial display zoom factor.

       -zoom_sensitivity float
               Multiplier  of  mouse motion to zoom factor, nega-
               tive values inverts action.

       -zoom_wheel float
               Multiplier of mouse wheel to zoom factor, negative
               values inverts action.

       -zoom_min float
               Minimum zoom factor.

       -bg R G B
               Background color where no image is rastered.

       -sb     Use  a  single-buffered visual.  Default is Double
               buffer.

       -noblock
               Don't wait for the current image to pass  all  the
               way  through the pipeline before trying to display
               it.

       -loose  Allow  a  non-fatal  race  condition  between  the
               XEvent  thread and the rendering thread, which may
               improve performance.  This can result in incorrect
               drawing  of  wrapped,  tiled,  and  probing scenes
               while mousing, and can sometimes fail to notice  a
               redraw.

       -a      Animate upon startup.  Off by default.

       -wrap   Wrap the latitude lines to make the image continu-
               ous for 360 degrees at all longitudes.

       -panorama  ...
               Calculate image position in all  windows  relative
               to  the  origin (upper-left corner) of the default
               (first) screen.  Arguments are X/Y pairs of  inte-
               ger offsets relative to the default screen and are
               ordered by screen  number.   When  used  with  the
               -fullscreen  option, the default center (or recen-
               tering the image with the return key)  scales  the
               image  to  fit  all the overall display dimensions
               instead of the current window.  With control link-
               ing  this  causes  all  windows and all screens to
               behave as a single screen.

       -component 
               Component(s) to  display  at  startup,  if  stereo
               pairs  are  present.   Controlled at runtime using
               the left and right arrow keys.

       -dont   Don't raster tiles, just draw a frame where it the
               tiles would be drawn (also the 'D' key).

       -ds     Don't attempt to sort the frames by name.


       GENERAL GUI OPERATION

       The  GUI has tiles which house input controls, performance
       indicators, and annotation.   The  tiles  may  be  hidden,
       shown,  or  iconified.   Iconic tiles are represented by a
       box showing the letter of the key which will deiconify the
       tile.    The  left  mouse  button  moves  icons  or  tiles
       restricted to the edges and axes of the subregion the but-
       ton was pressed in (f.e.: bottom left, left, top left, top
       middle, etc.).  All mouse and  keyboard  controls  may  be
       propogated to all the windows on all the screens via link-
       ing (-link or the 'L' key).

       -gui_tile R G B A
               Red, Green, Blue,  and  Alpha  components  of  the
               background in a gui tile.

       -gui_border R G B A
               Red, Green, Blue, and Alpha components of the wire
               rim around a gui tile.

       -gui_highlight R G B A
               Red, Green, Blue, and Alpha components of the  rim
               around a gui tile when it, or a control within it,
               has been selected.

       -gui_outline R G B A
               Red, Green, Blue, and Alpha components of the out-
               line  of the gui tile when it is being moved as an
               icon.

       -gui_text R G B A
               Red, Green, Blue, and  Alpha  components  of  text
               drawn using the default font.

       -gui_font fontname
               Default  font to use everywhere in GUIs except for
               the title and annotation.

       -gui_border_width n
               Width of the border around GUI  tiles  where  tile
               resizing  and  moving  is active, indicated by the
               clear margin between the background tile  and  the
               rim outline.

       -gui_border_line_width n
               Width  of  lines  drawn around tiles and tile sub-
               features.

       -gui_screenn n
               When -panorama and -fullscreen  are  both  active,
               the  GUI  will only be drawn on this screen.  This
               option has no effect  unless  both  -panorama  and
               -fullscreen are used.

       -gui    Hide the entire gui upon startup.  Also the G key.

       -noblend
               Do not use alpha blending for the GUI, draw every-
               thing opaque.


       PER-FRAME ANNOTATION

       The per-frame annotation, if specified, must appear as the
       last key-value pair (A=annotation) on a line in the  frame
       file (see -f).  The text, if any, is drawn centered in the
       tile.  If no per-frame annotations have been specified  at
       all,  the  annotation  gui tile is not created, and all of
       these arguments are ignored.

       -anno_font fontname
               Assign the X11 font to use for the annotation  gui
               tile.

       -anno_location X Y
               X and Y coordinates (in pixels, with the origin in
               the lower left corner) of the bottom  left  corner
               of  the annotation gui tile.  The tile is silently
               clamped to the edge of the window opposite of  the
               side of the gui tile outside the window.

       -anno_dims width height
               Set  the default width of the annotation gui tile.
               Silently clamped to the  smallest  box  which  can
               hold the largest annotation.

       -anno_icon
               Toggle  the initial iconic state of the annotation
               gui tile.


       TITLE

       A single title to display on all frames.  If no  title  is
       specified,  the  title  gui  tile is not created and these
       options are effectively ignored.

       -title string
               Sequence title text.  If specified, this string is
               also  used  as the window title by the window man-
               ager, otherwise a  constructed  string  containing
               hum,  the screen number (if there is more than one
               screen), and the invariant portion  of  the  file-
               names in the sequence.

       -title_font font name
               Set  the  X11  font  to use for the annotation gui
               tile.

       -title_location X Y
               X and Y coordinates (in pixels, with the origin in
               the  lower  left corner) of the bottom left corner
               of the title  gui  tile.   The  tile  is  silently
               clamped  to the edge of the window opposite of the
               side of the gui tile outside the window.

       -title_dims width height
               Set the default  width  of  the  title  gui  tile.
               Silently  clamped  to  the  smallest box which can
               hold the title.

       -title_icon
               Toggle the initial iconic state of the  title  gui
               tile.


       FRAME RATE CONTROL

       The Rate tile has a slider to select the current animation
       frame rate.  Clicking and dragging in the  bracketed  area
       positions  the  current  frame  rate  slider, the selected
       frames per second is shown to the  right  of  the  slider.
       Note: In order to allow animation rate to exceed the maxi-
       mum redraw rate, hum will skip frames when animating.

       The Frames line indicates the number of  different  frames
       drawn  in  each  window  (Win),  for  all the windows on a
       screen (Scr), and the total across all screens (Tot)  over
       a  period  of  -rate_sample.   Similarly, the Redraws line
       indicate the number  of  times  the  window  was  redrawn,
       regardless of frame number displayed.  If your version was
       compiled with dubugging, two  additional  lines  show  the
       respective frames and redraws counts.

       -rate_location X Y
               X  and Y coordinates (in pixels with the origin in
               the lower left corner) of the bottom  left  corner
               of  the frame rate gui tile.  The tile is silently
               clamped to the edge of the window opposite of  the
               side of the gui tile outside the window.

       -rate_dims width height
               Set  the default width of the frame rate gui tile.
               Silently clamped to the  smallest  box  which  can
               hold the frame rate gui.

       -rate_icon
               Toggle  the  iconic  state  of  the frame rate gui
               tile.

       -rate_range float float
               Minimum  and  maximum  range  of  the  frame  rate
               slider, in frames per second, respectively.  Nega-
               tive numbers are interpreted as reverse animation,
               and a negative minimum may be used with a positive
               maximum.  If both values  are  negative,  the  the
               minimum  must  always be a smaller real value than
               the maximum.

       -rate float
               Initial  frame  rate  (in  frames   per   second),
               silently   clamped   to  the  range  specified  by
               -rate_range.

       -rate_sample int
               Sampling window for calculating frames per second,
               in nanoseconds.

       -rate_thumb pixels
               Width  of the thumb in the rate slider, in pixels.

       -rate_color R G B A
               Red, Green, Blue, and Alpha components of the body
               of the rate slider.

       -rate_thumb_color R G B A
               Red,  Green,  Blue,  and  Alpha  of the frame rate
               slider thumb.

       -rate_thumb_alpha Alpha
               Alpha value to fill the frame  rate  thumb,  color
               from -rate_thumb_color is used.


       RETRY TIMERS

       Hum  uses a throtted busy-spin method for polling for work
       to mitigate the  variations  in  implemenations  of  mutex
       locks  and  semaphores, and facilitates tuning by favoring
       certain threads.  Making a retry timer smaller may or  may
       not  improve performance, but always requires more machine
       resources.  The default  retry  timer  values  consume  an
       "unmeasurably  small"  amount the CPU while Hum is sitting
       idle, and quicker retries may (or may not) improve perfor-
       mance with only marginally more CPU utilization.


       -retry_start_pipe usec
               If the deque process finds all pipelines are busy,
               it will wait this long before checking again.

       -retry_idle_gldriver usec
               If a screen does not  need  redrawing,  wait  this
               long before checking again.

       -retry_cache usec
               If  all the cache lines are busy because there are
               as more pipelines as cache slines and the queue is
               full,  allocation  attempts  do not retry for this
               long.

       -retry_empty_q usec
               If the queue  is  empty,  wait  this  long  before
               checking again.

       -retry_full_q usec
               If the queue is full, wait this long before trying
               to enque again.

       -retry_flush_input_segment usec
               If the segment after the read segment  (uncompress
               or  decode)  is  busy (read is blocked), wait this
               long.

       -retry_flush_lzw_segment usec
               If the segment after  the  decompress  segment  is
               busy (lzw is blocked), wait this long.

       -retry_block usec
               Readers  of  a  frame  (image  or metadata such as
               height and width) missing cache or finding it par-
               tially  processed  should  block  this long before
               reading again.


       PIPELINE AND CACHE

       Hum runtime configuration and tuning options.


       -cache number of lines
               Size of the cache, in lines.  The size of a  cache
               line  is  the  sum  of all the decoded components'
               memory requirements for a single frame.  See NOTES
               for more about cache effects.

       -npipes n
               Number of load-decode pipelines to create.

       -io_bufsz float
               Size of I/O segment, per pipeline, in MegaBytes.

       -lzw_bufsz float
               Size  of  decompression  segment, per pipeline, in
               MegaBytes.

       -decode_bufsz float
               Size  of  image  format  decoding   segment,   per
               pipeline, in MegaBytes.

       -prefetch number of frames
               When   fetching   a  frame,  try  to  concurrently
               prefetch  up   to   nframes   additional   frames.
               Defaults to MAX(default_npipes / 2, 1).

       The pipeline status indicates five states:

            Green = Idle        No work to do

            Gray  = Bypassed    Segment unused

            White  =  Busy        The  segment  is busy doing its
       work

            Red   = Stalled     Stalled waiting for next segment

            Blue  = Bubble      Waiting for more data

       The cache status indicates four states:

            Empty  = Dark Gray  Empty

            Unused = Blue       0 reads and 0 pending references

            Used   = Red        1 or more  reads  and  0  pending
       references

            In Use = Light Gray Currently displayed

       The following options change the appearence of the pipline
       tile:

       -pipes_location X Y
               X and Y coordinates (in pixels with the origin  in
               the  lower  left corner) of the bottom left corner
               of the pipeline gui tile.  The  tile  is  silently
               clamped  to the edge of the window opposite of the
               side of the gui tile outside the window.

       -pipes_dims width height
               Set the default  width  of  the  pipes  gui  tile.
               Silently  clamped  to  the  smallest box which can
               hold the pipes gui.

       -pipes_icon
               Toggle the iconic state of the pipes gui tile.

       -pipes_nrows_cache n
               Maximum number of rows of cache data to display.

       -pipes_working R G B A
               Red, Green, Blue, and Alpha components of segments
               which are busy/working.

       -pipes_idle R G B A
               Red, Green, Blue, and Alpha components of segments
               which are idle.

       -pipes_bypass R G B A
               Red, Green, Blue, and Alpha components of segments
               which are bypassed.

       -pipes_bubble R G B A
               Red, Green, Blue, and Alpha components of segments
               which have a bubble.

       -pipes_stall R G B A
               Red, Green, Blue, and Alpha components of segments
               which are stalled.

       -cache_empty R G B A
               Red,  Green,  Blue,  and Alpha components of cache
               blocks which are empty.

       -cache_unused R G B A
               Red, Green, Blue, and Alpha  components  of  cache
               blocks which are unused (0 reads, 0 refs).

       -cache_inuse R G B A
               Red,  Green,  Blue,  and Alpha components of cache
               blocks which are in use (1 or more refs).

       -cache_used R G B A
               Red, Green, Blue, and Alpha  components  of  cache
               blocks which are used (1 or more reads, 0 refs).


       PROBE

       The  probe  shows  the  approximate  pixel position of the
       mouse (in floating point) and the RGB value of the  pixel.
       Probe registration may be inexact due to the normal varia-
       tion in rounding between IEEE  and  your  OpenGL  floating
       point  implementation.   If stereo imagery is loaded, only
       the RGB values of the left frame are shown.  If -nswe  has
       been  specified,  the  latitude  and  longitude  (using  a
       cynlindrical equidistant projection) of the probe are also
       shown.   The  probe  tile  may  be transient or permanent,
       depending on the -probe  option.   Moving  or  resizing  a
       transient  window is done by first pressing the right but-
       ton to display the gui tile, then adding  a  second  mouse
       button to adjust location or size as normal.

       -probe 
               off,  the  default,  will  not  show  the probe on
               startup.  track will cause the gui tile to  always
               be  displayed  and  the probe to always stay under
               the mouse.  linger displays the gui  tile  if  the
               window  has focus and leaves the probe at its last
               position.  on shows the probe on startup.

       -probe_location X Y
               X and Y coordinates (in pixels with the origin  in
               the  lower  left corner) of the bottom left corner
               of the probe  gui  tile.   The  tile  is  silently
               clamped  to the edge of the window opposite of the
               side of the gui tile outside the window.

       -probe_dims width height
               Set the default  width  of  the  probe  gui  tile.
               Silently  clamped  to  the  smallest box which can
               hold the probe gui.

       -probe_size Npixels
               Width and height of the probe box, in pixels.

       -nswe north south west east
               Latitude and longitude at the edges of the  image.
               Longitude should be specified from -180 to 180.


       VECTORS

       Each  frame may have a vector overlay component which is a
       file in humv Hum Vector format.  The header of humv format
       is discussed in detail elsewhere.


       -novector
               Suppress display of the vector overlay on startup

       -vector_color R G B A
               Red,  green,  blue,  and  alpha  components of the
               color to use when drawing the vectors.

       -vector_scale float
               By default, Hum draws one pixel for each  unit  of
               magnitude.   This  multiplier  sets the scaling of
               the magnitude to pixels.

       -vector_density float
               Percentage of  all  pixels  in  the  window  which
               should have a vector drawn.

       -vector_width float
               Number  of  pixels wide used for lines to draw the
               arrow.

       -vector_barb_width float
               Lateral displacement from head of vector  to  draw
               the barbs.

       -vector_barb_height float
               Displacement  from  head  of  vector  to  draw the
               barbs.


       DEBUGGING DIAGNOSTICS

       If hum is built with debugging, the following options  are
       also available.  -diag_perf is always compiled in.

       -diag_perf
               Print basic performance statistics to -diag_fname.

       -diag_io
               Print  diagnostics  in  IO  code  to  -diag_fname.
               Image  header  data  is  always available via this
               option, regardless of compilation.

       -diag_pipes
               Print diagnostics related to pipes to -diag_fname.

       -diag_x Print significant X events to -diag_fname.

       -diag_trace
               Print   the   Entry/Exit   of   every  routine  to
               -diag_fname.

       -diag_mem
               Print memory allocation statistics upon update  to
               -diag_fname.

       -diag_timers
               Like  -diag_trace,  but  also show total execution
               time.

       -diag_fname filename
               Route  all  diagnostics  to  filename  instead  of
               STDERR.

       iag_flush_interval usec
               Time  to wait, in microseconds, between flushes of
               the diagnostic file.





EXAMPLES
       Look at a picture: unix% hum picture.rgb

       Animate a series: unix% hum *.rgb -a

       Example typical tuning: unix% hum -a -cache 300  -prefetch
       20 -npipes 4 *.rgb



NOTES
       All colors are expressed in floating point values from 0.0
       (black) to 1.0 (full  intenisty).   Alpha  components  are
       always specified from 0.0 (clear) to 1.0 (opaque).

       The  prefixes  Kilo,  Mega, and Giga in this manpage refer
       2^10, 2^20, and 2^30 respectively.

       Each pipeline consists of three threads: I/O,  decompress,
       and  decode.   There  are  also  threads for X events, and
       OpenGL driving.  The logical hum pipelines  are  unrelated
       to  the number of CPUs hum will utilize: A single pipeline
       invocation of hum results in 4-7 threads, which the  oper-
       ating  system  will  schedule at runtime among the proces-
       sor(s) using the scheduling policy chosen  by  the  -sched
       option.

       The  default  cache size, number of pipes, prefetech depth
       and queue size are nieve at best, and outright stupid much
       of  the  time.   Unfortunately, the complexities of tuning
       hum are  arbitrarily  complicated,  so  hum  doesn't  even
       really  try.   In  generaly, you should use as much memory
       for cache as much as you can, and do not make queue and/or
       prefetch  (sum  of the two) more images than the cache can
       hold because this creates an opportunity  to  evict  still
       needed but not yet used data from cache.

       Maximum  pipeline  segment  capacity  is the segment cache
       size, but is effectively the size of the output  from  the
       previous  segment.   If  I/O  =  1000KB,  LZW = 500KB, and
       DECODE = 700KB, then the DECODE segment  will  never  have
       more  than 500KB in it.  The decode segment caches must be
       big enough and actually hold the entire image header  (the
       header cannot span more than one unit's worth of data).

       Images  that  require  random access to their raw files to
       decode (ie: Run Length Encoded RGB files)  allocate  tran-
       sient  buffers  large  enough to hold the entire raw file,
       which presents a 200% space requirement.  This  is  not  a
       bug, this is a "feature" of the image format.

       Users  should  not  expect all windows to stop on the same
       frame when they hit the space bar  because  the  animating
       flag  can  be toggled while drawing is taking place.  Win-
       dows immediately cease to animate when the animating  flag
       becomes  false,  no  cycle  through  all  the  windows  is
       implied.

       hum can display more images than can be held in the cache,
       but  because  frames are fetched asynchronously from draw-
       ing, it is possible to load a  frame  and  evict  it  from
       cache  before it is used.  hum will alert the user to this
       condition and recommended closing  windows  or  increasing
       the size of the cache.

       Stereo images may be loaded even if a stereo visual is not
       supported on the display.  In this  scenario,  either  the
       left  or  the right frame is displayed, and selected using
       the left and right arrows on the keyboard.

       hum makes extensive use of the m4 macro language for auto-
       matic  code  generation.  In the source code the following
       naming convention is used to differentiate different souce
       code  layers:  ALL_CAPS_USE_UNDER() are CPP macros, Mixed-
       CapsNoUnder() are M4 macros, and all_lower_use_under()  is
       C code.



SEE ALSO
       m4(1),  X(1),  pnm(5),  pnmtosgi(1),  xlsfonts(1), xfd(1),
       xfontsel(1), Xnest(1), gunzip(1), Pthreads,  OpenGL,  ANSI
       C, POSIX 1003.1.



ENVIRONMENT
       DISPLAY is  used  to  get  the default host and display to
               use.     Overridden     by     -display     [host-
               name]:[.].

       Some  systems have environment variables which control the
       behavior of Pthreads programs.  Consult your user  manual.



BUGS
       If  a  filename begins with - (minus), the argument parser
       will mistake it for an (incorrect) argument, and will skip
       that file.

       Sorting frames by filename isn't implemented.

       It  is  assumed that the left and right images of a stereo
       pair are the same dimensions.  This assumption vastly sim-
       plifies the semantics of registration and the code itself.

       The decompression code relies on punzip, which hasn't been
       implemented  yet.   For  now  it's  just a memcpy(3) and a
       brief nap.

       If -prefetch is set to one,  and  the  pipeline/cache  gui
       tile  is  not  displayed, prefetching will still occur but
       animation will not.

       The threaded graphics driver (MULTI_DRIVER) is untuned and
       untested due to Solaris thread problems, and x86 PC archi-
       tecture limitations.

       The GUI has the following known inconsistencies: Moving  a
       GUI  tile with constraints has no constraints when the GUI
       is  an  icon  in  another  window.   Iconification  should
       observe  iconic  gravity,  but is always NorthWest.  Some-
       times the pipes/cache tile chooses a bad initial size, but
       figures  this  out  when  you try to resize it.  Automatic
       tile placement, in general, is embarassing.  Toggling  the
       un/lock  state  while resizing or moving a tile will cause
       some windows to not be redrawn one last time to show  they
       are no longer active.

       In  -panorama  mode, the probe only works correctly in the
       center_instance.

       There is no state  display  for  un/locked,  which  should
       probably be indicated by changing the mouse.

       Tiled performance is very poor, but there is much room for
       future improvment, most of  which  could  be  realized  by
       reducing  the total instruction count and moving invariant
       expressions out of the loop(s).  The upside of this imple-
       mentation  is  that  it's  analytic  (and it's paralleliz-
       able!).

       Solaris has the following bugs which exhibit themselves in
       hum:  1.   The  threaded  X client has race conditions, so
       multiple screen drivers and the X  Event  handling  thread
       won't  work.   2.   OpenGL  1.1 (and early 1.2) have a bug
       which defeats smooth scrolling on Elite3D graphics  cards.
       3.   The  M4  quoting  should happen immediately, but must
       follow all uses of defn() since when it quotes the defini-
       tion,  it  does  so  with  hardcoded quotes instead of the
       current quote value.  Furthermore, it does not  allow  the
       pushdef of a built-in, which must be redefined.  This only
       affects the source code in macros.m4 during the M4  built-
       in  namespace  remapping.  Quoting seems to generally have
       different precedence between GNU and Solaris.   4.  Incor-
       rect optimization can cause some keystrokes to be ignored,
       and the user may have to hit the key  repeatedly  to  have
       the action taken.

       DEC  OSF  Unix  has the following bugs which exhibit them-
       selves in hum: 1.  The threaded X client has  race  condi-
       tions, so multiple screen drivers and the X Event handling
       thread won't work, and 2.  POSIX's nanosleep is documented
       but  not  exported,  so  the  nanosleep_d9 binding is used
       instead of nanosleep. (This may be my bug, though)

       LinuxPPC has the following bugs which  exhibit  themselves
       in  hum:  1.   The  colors  of  the cache status boxes are
       wrong... But is this really Mesa's bug?

       SGI IRIX has the following bugs which  exhibit  themselves
       in  hum: 1. By default, The 4DWM window manager clamps the
       largest window size, but does  not  update  the  viewport,
       resulting in overwrite of window manager decorations.

       The  Makefile  should use the commented-out two-rule chain
       of .c4 -> .c -> .o but this doesn't work on  all  versions
       of  make.   When it does work, make recogizes the .c as an
       intermediate file and automatically removes it  when  make
       exits.   The advantage of the chain rule is that the .c.o:
       built-in rule is defeated.



DISTRIBUTING
       hum is the property of ROTANG, and it  is  distributed  to
       users  for  licensed purposes.  No Hum source code, binary
       data, or doumentation may be distributed  without  written
       permission of ROTANG.



AUTHOR
       Jace  A Mogill, CEO/Emperor/Line Welder at ROTANG, is also
       a Computer Scientist at Cray Inc. (by way of Tera Computer
       Company), and a mighty fine bassist.

       ROTANG, purveyors of the world's finest optional software,
       also provides consulting services to  institutions  inter-
       ested   in   multithreading  and  latency  hiding  through
       pipelining, as well as services to repair and/or tune  any
       FORTRAN  program  regardless  of  its  condition.   ROTANG
       undermines Corporate software with UnderWare, and believes
       all your base are belong to us.

       Email:  mogill@rotang.com   --    ROTANG!  ZOOM! NOT BOOM!
       (tm)




Release 1.5.0            10 November 2002                  hum(1)