Annotation of researchv10dc/vol2/graphics/cmd.ms-1, revision 1.1.1.1

1.1       root        1: .so ../ADM/mac
                      2: .XX 30 491 "The 10th Edition Raster Graphics System"
                      3: .fp 5 T CW     \" T for Typewriter
                      4: .de TP \" An indented paragraph describing some command, tagged with the command name
                      5: .IP "\\fT\\$1\\fR" 8
                      6: .if \\w'\\fT\\$1\\fR'-7n .br
                      7: ..
                      8: .de CI
                      9: .nr Sf \\n(.f
                     10: \%\&\\$3\f(CW\\$1\fI\&\\$2\f\\n(Sf
                     11: ..
                     12: .TL
                     13: The 10th Edition Raster Graphics System
                     14: .AU
                     15: Tom Duff
                     16: .AI
                     17: .MH
                     18: .AB
                     19: The current (late 1989) state of generating and displaying raster graphics
                     20: in Research
                     21: .UX
                     22: is described.
                     23: .AE
                     24: .2C
                     25: .NH
                     26: Introduction
                     27: .PP
                     28: The Research
                     29: .UX
                     30: system contains a number of commands to capture, manipulate,
                     31: display and record monochrome and full-color raster images.  Three groups of
                     32: commands may be identified:
                     33: interactive programs that operate on a frame-buffer,
                     34: commands that operate on images stored in picture
                     35: files (see
                     36: .I picfile (5)
                     37: or |reference(picfile v10)),
                     38: and programs that interface to various graphical I/O devices:
                     39: video cameras, scanners, paper plotters, film cameras and video-tape
                     40: recorders.
                     41: .NH
                     42: Video Facilities
                     43: .PP
                     44: No discussion of our raster graphics software can ignore the
                     45: hardware on which it runs.  The hardware available at different
                     46: sites will, of course, vary.  For definiteness, and to provide
                     47: help for the local audience, this section will discuss the
                     48: hardware available in Center 1127's graphics and image processing
                     49: laboratory (MH 2C-524) and its neighborhood.  Most other environments
                     50: will have hardware that is similar in spirit if different in detail.
                     51: .PP
                     52: There are seven work stations in 2C-528.  On the day this was written,
                     53: five of them had TTY 5620 terminals, one had a Gnot terminal and
                     54: one had a SUN-3 workstation computer.  Eventually, most of the 5620's
                     55: will be replaced with Gnots.  Each work station also has
                     56: a Sony GDM-1901-12 video monitor that displays high-resolution
                     57: video signals.
                     58: .PP
                     59: The room contains other video displays and recorders, including
                     60: a Barco video projector in the ceiling, a 35-inch Mitsubishi monitor
                     61: at the front of the room, a 19-inch Barco monitor at work station 6,
                     62: two small Sony monitors in the video rack next to the audio console,
                     63: two Panasonic Super-VHS recorders, a Sony 3/4-inch (U-MATIC) video
                     64: player, a multi-standard (SECAM, NTSC, PAL) VHS player, a
                     65: Sony BVH-2500 1-inch (SMPTE-C) video tape recorder and a Sony video
                     66: camera.
                     67: .PP
                     68: The video equipment supports at least three incompatible video formats.
                     69: High-resolution
                     70: rgb video has 1024 scan lines, a 60 hz non-interlaced vertical scan rate,
                     71: and transmits red, green and blue information on separate cables with
                     72: synchronization pulses superimposed on the green channel.
                     73: Low-resolution rgb video has between 480 and 488 scan lines, 30hz
                     74: interlaced vertical scan, and separate rgb with sync on green.
                     75: NTSC (National Television Standards Committee) video has the same timing
                     76: characteristics as low-resolution rgb video, but encodes red, green, blue
                     77: and sync into a single signal.
                     78: NTSC is the encoding used by American, Canadian and Japanese television
                     79: broadcasters, and by almost all video recording and playback equipment
                     80: in those countries.
                     81: .PP
                     82: Various computer terminals generate video in other formats that our
                     83: equipment handles with only limited success.  Gnots, 630s,
                     84: 5620s, Sun terminals, IBM-compatible PCs and Macintoshes all generate
                     85: mutually incompatible video.  Their vertical and horizontal scan-rates
                     86: differ.  The voltages and impedences of the signals they produce differ.
                     87: Their color encodings differ.  Monitors that can display video from all
                     88: of these sources are rare, let alone hardware to convert from one format
                     89: to another.  For example, the only reliable way to record a signal from
                     90: any of these sources is to place a camera in front of a monitor.  The
                     91: quality of the resulting recordings is often bad.  It is a black art
                     92: to adjust our Barco video projector to handle non-standard signals,
                     93: but with a few days notice it can often be done.  Again, the results
                     94: are not often as good as one might like \(mi the projector does not
                     95: focus as tightly as a monitor and its brightness is limited.  As better
                     96: video displays become available our situation will improve.
                     97: Table 1 summarizes the equipment available and the
                     98: video formats that each supports.
                     99: .1C
                    100: .KF
                    101: .TS
                    102: center box;
                    103: l| c| c| c| c| c| c.
                    104: Equipment      High-res        Low-res NTSC    Gnot    IBM     PAL/SECAM
                    105:        RGB     RGB
                    106: =
                    107: workstation monitors   \(bu
                    108: _
                    109: Barco projector        \(bu    \(bu    \(bu    \(bu    maybe   maybe
                    110: _
                    111: 35-inch Mitsubishi             \(bu    \(bu            \(bu
                    112: _
                    113: Barco  at work station 6               \(bu    \(bu
                    114: _
                    115: Sony rack monitors                     \(bu
                    116: _
                    117: Super-VHS recorders                    \(bu
                    118: _
                    119: U-MATIC player                 \(bu
                    120: _
                    121: 1-inch recorder                        \(bu
                    122: _
                    123: multi-standard player                                          \(bu
                    124: _
                    125: camera         \(bu    \(bu
                    126: _
                    127: Metheus frame buffers  \(bu
                    128: _
                    129: ITI frame buffer               \(bu
                    130: _
                    131: Pixel Machine  \(bu    \(bu
                    132: .TE
                    133: .sp .3
                    134: .ce
                    135: \fBTable 1. \fRVideo devices
                    136: .SP .5
                    137: .KE
                    138: .2C
                    139: .PP
                    140: We have several Metheus 3610 frame buffers (four on
                    141: .CW pipe ,
                    142: one on
                    143: .CW arend ,
                    144: one on
                    145: .CW encke )
                    146: and an Imaging Technology, Inc. (ITI) RGB-512.  All of our
                    147: frame buffers store 32 bits at each pixel, one byte each for red, green
                    148: blue and alpha.  The 3610's generate high-resolution (1280\(mu1024)
                    149: video.  The ITI generates low-resolution (512\(mu480) video that may
                    150: be recorded on video tape after conversion to NTSC.  Connected to
                    151: .CW sol ,
                    152: the Sun-3/160 at work station 1, is an AT&T Pixel Machine with
                    153: 58 processors.  It can generate either high- or low-resolution video
                    154: under software control; the Pixel Machine documentation can tell you how.
                    155: .PP
                    156: Each piece of video equipment is connected to one of two
                    157: video switches.  One switch handles high or low-resolution rgb video.
                    158: The other handles NTSC video exclusively.  Under computer control, any
                    159: output port may be connected to any input port of the same switch.
                    160: The
                    161: .CW "vsw [-dcrvpi] [\fIiopair\fP ...]
                    162: command controls the video switches.
                    163: The switches' inputs and outputs are labelled by single characters
                    164: 0-9 and a-z.
                    165: An
                    166: .I iopair
                    167: is a pair of characters indicating an input and output to be connected
                    168: together.
                    169: The flags mean:
                    170: .TP -r
                    171: operate the rgb switch.
                    172: .TP -c
                    173: operate the composite (NTSC) switch.
                    174: .TP -d
                    175: print a description of the switch's inputs and outputs
                    176: .TP -p
                    177: print a list of iopairs indicating the state of the switch.
                    178: .TP -i
                    179: initialize the switch to an unknown state.
                    180: .TP -v
                    181: with
                    182: .CW -p
                    183: or
                    184: .CW -d ,
                    185: make the descriptions more verbose.
                    186: .LP
                    187: The video switch is
                    188: .I not
                    189: straightforward to use.
                    190: It is easy to be confused about what the inputs and outputs are;
                    191: always remember that these are from the switch's point of view.
                    192: Thus, the input marked
                    193: .CW "pixel machine"
                    194: is the Pixel Machine's output.
                    195: The connections to the video switch have a history of ad hoc undocumented
                    196: changes.
                    197: .PP
                    198: The Sony BVH-2500 video recorder produces very high
                    199: quality recordings on 1" video tape.  Since it can overwrite
                    200: arbitrary single frames of the tape, it is an ideal machine
                    201: on which to record animation.
                    202: .PP
                    203: Before using a new tape,
                    204: you must record (``grind'') time-code on it, numbering
                    205: each frame of the tape.
                    206: Time-code values are usually denoted by values
                    207: of the form
                    208: .I hh.mm.ss.ff
                    209: (like
                    210: .CW 02.43.17.15 ).
                    211: The 2500's monitor output, called
                    212: .CW 2500.mon
                    213: by
                    214: .I vsw ,
                    215: displays time-code superimposed on the 2500's
                    216: output signal.
                    217: .PP
                    218: To grind time-code, use
                    219: .I vsw
                    220: to connect the color bar generator
                    221: (\fIvsw\fP calls this
                    222: .CW cbars )
                    223: to the 2500's input, thread up a tape, and manually set the
                    224: 2500 to record by pushing its
                    225: .I record
                    226: and
                    227: .I play
                    228: buttons simultaneously.  Let it go until the tape runs out.
                    229: .PP
                    230: The
                    231: .I 2500
                    232: command operates the recorder, reading instructions
                    233: from its standard input.  Its instruction set is
                    234: moderately complicated; for most uses the following
                    235: subset is adequate:
                    236: .TP "cue \fIhh.mm.ss.ff
                    237: Cue the tape to the given time code.  The
                    238: time-code displayed on the 2500's monitor
                    239: output may be a few frames off,
                    240: but the recorder will be cued to the correct point.
                    241: .TP "still mode on
                    242: Put the recorder in single-frame record mode.
                    243: .TP "still mode off\fP
                    244: Put the recorder out of single-frame record mode.
                    245: .TP "snap [\fIn\fT]
                    246: Record
                    247: .I n
                    248: frames (default 1) at the current cue point, and
                    249: advance the cue point by
                    250: .I n
                    251: frames.  The recorder must be in single frame mode.
                    252: .TP "play
                    253: Start playing back from the current cue point.
                    254: .TP "stop
                    255: Stop the recorder.
                    256: .TP "!\fIunix-command
                    257: Run the given
                    258: .I unix-command
                    259: using
                    260: .CW /bin/sh .
                    261: .PP
                    262: We currently have only two sources of digital video that
                    263: may be recorded on video tape.  These are the Pixel Machine
                    264: and the ITI frame buffer attached to kwee.  To use either
                    265: one, you must use
                    266: .CW "vsw -r
                    267: to patch its output to the NTSC color encoder,
                    268: and
                    269: .CW "vsw -c
                    270: to patch the endcoder's output to the video recorder.
                    271: The ITI frame buffer is also useful as a frame-grabber,
                    272: capturing its video input in its memory whence it may
                    273: be saved in a picture file or otherwise manipulated.
                    274: .PP
                    275: The ITI is served by an ancient software regime whose
                    276: commands all begin with the letters
                    277: .CW iti .
                    278: .TP "itifbinit -x
                    279: Re-initialize the ITI to the state expected by the
                    280: rest of the software.  The ITI is often unused for
                    281: days at at time, during which its health often
                    282: decays.
                    283: .CW itifbinit
                    284: is its restorative.  The
                    285: .CW -x
                    286: flag causes its input and output to be synchronized.
                    287: This is always a good idea.
                    288: .TP itigamma
                    289: Load the ITI's color map to correct intensities
                    290: for display on CRT monitors.
                    291: .TP "itigrab -[gs]
                    292: Run the frame-grabber.  The
                    293: .CW -g
                    294: flag starts the frame-grabber running.
                    295: The displayed image will track the ITI's input
                    296: video.
                    297: .CW -s
                    298: stops the frame-grabber, freezing the image.
                    299: Unadorned by flags,
                    300: .CW grab
                    301: starts the frame-grabber and stops it one frame
                    302: later.
                    303: .TP "itigit \fIpicture-file
                    304: Copy the image stored in
                    305: .I picture-file
                    306: into the ITI.
                    307: .TP "itisiv \fIpicture-file
                    308: Save the image in the ITI in
                    309: .I picture-file .
                    310: .PP
                    311: Paragraphs needed describing imagitek scanner, henry's document
                    312: scanners, matrix qcr, postscript.
                    313: .NH
                    314: Frame-buffer commands
                    315: .PP
                    316: A frame buffer is a large memory organized as a two-dimensional array of
                    317: pixels.  Our Metheus 3610 frame buffers have 1024 scan lines of 1280 pixels
                    318: each.  The ITI frame buffer has 480 lines of 512 pixels.  The coordinate
                    319: system has (0,0) in the upper left-hand corner, with x increasing to
                    320: the right, and y increasing down.  This apparent weirdness is fairly standard,
                    321: since it makes video output happen in row-major order.
                    322: .PP
                    323: Here we will mostly discuss commands for the Metheus displays.  The corresponding
                    324: ITI commands have the same names, but prefixed with the string
                    325: .CW iti .
                    326: .PP
                    327: There are several Metheus frame buffers attached to pipe, named
                    328: .CW /dev/om[0-7] .
                    329: All of the commands discussed below determine which one to use
                    330: by examining the environment variable
                    331: .CW FB .
                    332: It is often hard to tell what frame buffer is displayed on which monitor
                    333: because of the video switch.  The
                    334: .CW fbi
                    335: (frame buffer identification) command displays each frame buffer's name in it.
                    336: .PP
                    337: Our frame buffers all have 32 bits per pixel, divided into
                    338: four 8-bit channels.  The channel values are normally thought of
                    339: as fractions ranging from 0 to 1, although frame buffer commands perversely
                    340: refer to them as integers between 0 and 255.
                    341: Three of the channels specify the red, green and
                    342: blue color components of the image.  The fourth channel, called
                    343: .I alpha ,
                    344: is used to indicate whether or not the image covers the pixel, and is not
                    345: normally displayed.
                    346: .I Alpha
                    347: is used to control image compositing operations|reference(porter duff compositing digital images).
                    348: Fractional values of
                    349: .I alpha
                    350: describe pixels that the image partly or translucently covers, and
                    351: facilitate anti-aliased compositing.
                    352: .PP
                    353: Each frame buffer contains three 256 entry look-up tables that specify
                    354: mappings from the values stored in the red, green and blue channels
                    355: to the voltages supplied at the frame buffers' video outputs.
                    356: The
                    357: .CW "gamma [\fIpower\fP]
                    358: command loads these tables are loaded with a function that
                    359: inverts the power-law relation between voltage and luminous flux
                    360: normally encountered in CRT displays.  Thus, pixel values normally
                    361: correspond directly to displayed intensities.
                    362: .I Power
                    363: is the exponent of the power-law.  The default of 2.3 is adequate
                    364: for all our displays.
                    365: .PP
                    366: Other patterns may be loaded into the color map by
                    367: .CW "getmap \fIfile\fP [...]
                    368: command, whose arguments are a list of files containing color maps.
                    369: On the ITI, the argument `\fT%\fP' refers
                    370: to the current content of the frame buffer's color map.  (The Metheuses'
                    371: color maps are write-only.)  The functional composition of the specified
                    372: color maps is loaded into the frame buffer's color map.
                    373: .CW Getmap
                    374: searches for files in the current directory and in
                    375: .CW /fb/cmap
                    376: and
                    377: .CW /usr/td/cmap/lib .
                    378: A color map file contains 256 records of 3 bytes each, specifying the output
                    379: values for the corresponding red, green and blue input values.
                    380: The
                    381: .CW ranmap
                    382: command loads random values into the color map.
                    383: .PP
                    384: Our frame buffers have the ability to magnify a part of the image, via the
                    385: .CW "zoom [\fIamount\fP [\fIx y\fP]]
                    386: command.
                    387: With three arguments,
                    388: .CW zoom
                    389: magnifies by
                    390: .I amount ,
                    391: mapping the point
                    392: .I "(x, y)
                    393: (default (0,0)) to the upper left-hand corner of the screen.
                    394: With no arguments,
                    395: .I Amount
                    396: defaults to 1.
                    397: The Metheuses can magnify by any integral factor from 1 to 16.
                    398: The ITI can magnify only by 1 or 2.
                    399: .PP
                    400: An array of images can be viewed in sequence by zooming and panning
                    401: using the
                    402: .CW "movie \fIxsize ysize nx ny\fP [\fIdelay\fP]
                    403: command.  The arguments are the size of the individual
                    404: frames, the number of frames in the array in each
                    405: direction, and optionally the number of 60ths of a second
                    406: to delay between frames.  The frames must be arranged
                    407: boustrophedonically, with alternate rows proceding from
                    408: left to right and right to left.  (This is because neither
                    409: Metheus nor ITI frame buffers can pan in x and y simultaneously
                    410: without glitching.)
                    411: .PP
                    412: There are a number of commands to load simple patterns into the frame buffer:
                    413: .TP "clr [-w \fIx0 y0 x1 y1\fT] [\fIr\fT [\fIg b\fT [\fIalpha\fT]]]
                    414: sets all pixels to the given value.  If only
                    415: .I r
                    416: is given,
                    417: .I g
                    418: and
                    419: .I b
                    420: are set to
                    421: .I r .
                    422: If
                    423: .I alpha
                    424: is not given, it is set to 255 (completely opaque.)
                    425: The
                    426: .CW -w
                    427: flag restricts attention to pixels inside the window whose upper-left corner is
                    428: .I (x0,y0)
                    429: and with
                    430: .I (x1,y1)
                    431: just diagonally outside the lower-right corner.
                    432: .TP cbars
                    433: displays a color-bars test pattern.  The 8 bars at the top exercise all combinations
                    434: of the 3 primary colors.  The 9 patches at the bottom are a logarithmic
                    435: (perceptually uniform) grey scale.
                    436: .TP "ramp [-w \fIx0 y0 x1 y1\fT] [-v] [[\fIcol0\fT] \fIcol1\fT]
                    437: displays a horizontal ramp whose color is
                    438: .I col0
                    439: at the left
                    440: and
                    441: .I col1
                    442: at the right.
                    443: Colors are specified as for
                    444: .CW clr
                    445: (green and blue default equal to red, alpha defaults to 255).
                    446: If
                    447: .I col0
                    448: defaults to
                    449: .CW "0 0 0 255" .
                    450: .CW -w
                    451: restricts
                    452: .CW clr
                    453: to the given window.
                    454: .CW -v
                    455: gives a vertical ramp with
                    456: .I col0
                    457: at the top
                    458: and
                    459: .I col1
                    460: at the bottom.
                    461: .TP "colors [-gfr]
                    462: displays a 16 by 16 array of grey-colored (equal red, green and blue) squares in
                    463: the middle of the screen with red, green and blue ramps at the top.  This is
                    464: mostly useful for examining color maps.  The flags modify the display in small ways.
                    465: .CW -r
                    466: suppresses the ramps.
                    467: .CW -g
                    468: suppresses the gaps between the squares.
                    469: .CW -f
                    470: expands the display to fill the full screen, making the patches non-square and
                    471: suppressing the ramps.
                    472: .PP
                    473: The
                    474: .CW xhair
                    475: command can be used to examine the contents of the frame buffer.
                    476: It is named after the cross-hair that it draws on the screen.  Single
                    477: character commands manipulate the cross-hair, magnify the video and
                    478: print pixel values.  The commands are
                    479: .nf
                    480: .ta 8n
                    481: \fTh\fP        print the help message
                    482: \fTlrud\fP     move left, right, up or down 1 pixel
                    483: \fTLRUD\fP     move left, right, up or down 16 pixels
                    484: \fT0\fP        move to center of screen (x=256, y=240)
                    485: \fT1-8\fP      magnify \(mu1\-8
                    486: \fT9\fP        magnify \(mu16
                    487: \fTp\fP        print current coordinates and pixel value
                    488: \fTP\fP        print pixel after each command (toggle)
                    489: \fTm\fP        type coordinates to move to
                    490: \fTx\fP        type x coordinate to move to
                    491: \fTy\fP        type y coordinate to move to
                    492: \fTc\fP        change the crosshair display to a rectangle
                    493: \fTs\fP        manipulate other corner of rectangle
                    494: \fT^D,q\fP     exit xhair and run command
                    495: \fTQ\fP        exit xhair, don't demagnify or run command
                    496: \fTX\fP        exit and don't run command
                    497: .PP
                    498: If
                    499: .CW xhair
                    500: is given arguments, they represent a command to be executed before exiting,
                    501: after making substitutions for any argument whose first character is
                    502: .CW % .
                    503: The substitutions made are:
                    504: .ta 8n
                    505: .nf
                    506: \fT%r\fP       the current rectangle
                    507: \fT%w\fP       the current rectangle
                    508: \fT%p\fP       the upper-left corner of the rectangle
                    509: \fT%o\fP       the upper-left corner of the rectangle
                    510: \fT%c\fP       the lower-right corner of the rectangle
                    511: \fT%x\fP       the x coordinate of the upper-left corner
                    512: \fT%y\fP       the y coordinate of the upper-left corner
                    513: \fT%X\fP       the x coordinate of the lower-right corner
                    514: \fT%Y\fP       the y coordinate of the lower-right corner
                    515: .NH
                    516: Picture file commands
                    517: .PP
                    518: Most of our raster graphics commands require no special hardware.  They synthesize
                    519: images in picture files from textual or other discriptions, they modify images
                    520: in picture files, producting results in picture files, or they combine the contents
                    521: of several picture files to produce composite images, again storing the result in
                    522: a picture file.
                    523: .PP
                    524: The simplest picture file command is
                    525: .CW pcp ,
                    526: which takes two picture file names and copies the first onto the second.
                    527: Names whose first character is
                    528: .CW %
                    529: are interpreted specially:
                    530: .ta 8n
                    531: .nf
                    532: \fT%in\fP      read from standard input
                    533: \fT%out\fP     write standard output
                    534: \fT%0\fP       Metheus frame buffer #0.
                    535: \&...
                    536: \fT%7\fP       Metheus frame buffer #7.
                    537: \fT%iti\fP     ITI frame buffer.
                    538: .fi
                    539: .PP
                    540: .CW Pcp
                    541: has a number of options that alter the copied picture:
                    542: .TP "-o\ \fIx y
                    543: Add
                    544: .I "(x,y)
                    545: to the picture's window coordinates.
                    546: .TP "-w \fIx0\ y0\ x1\ y1
                    547: Clip the input picture's window to the given coordinates.
                    548: If
                    549: .CW -o
                    550: and
                    551: .CW -w
                    552: are both given, the window is clipped before being offset.
                    553: .TP "-t\ \fItype
                    554: The output picture will have
                    555: .CW "TYPE= \fItype" .
                    556: .TP "-c\ \fIchannels
                    557: The output picture will have
                    558: .CW "CHAN=\fIchannels" .
                    559: .I Channels
                    560: must be one of
                    561: .CW m ,
                    562: .CW ma ,
                    563: .CW rgb ,
                    564: .CW rgba ,
                    565: .CW mz... ,
                    566: .CW maz... ,
                    567: .CW rgbz... ,
                    568: or
                    569: .CW rgbaz... .
                    570: Likewise, the input picture must
                    571: have
                    572: .CW CHAN=
                    573: set to one of these possibilities.
                    574: If the input has no
                    575: .CW a
                    576: channel, 255 is used.
                    577: If it has no
                    578: .CW z...
                    579: channels, floating point 0. is used.
                    580: Color images are converted to monochrome using the standard
                    581: NTSC luminance (\fTa=.30r+.59g+.11b\fP).
                    582: Monochrome images are converted to color by \fTr\fP=\fTg\fP=\fTb\fP=\fTm\fP.
                    583: .PP
                    584: The
                    585: .CW lam
                    586: command combines any number of images, writing a picture file whose window
                    587: is large enough to contain all the windows of its inputs.  The input files
                    588: are combined with pixels of later images overwriting earlier ones.  As
                    589: this is only really useful if the windows of the input images differ,
                    590: each input name may be preceded by
                    591: .CI -w "x0 y0 x1 y1
                    592: and
                    593: .CI -o " x y
                    594: options to clip and offset it.
                    595: Options
                    596: .CI -W " x0 y0 x1 y1
                    597: and
                    598: .CI -O " x y
                    599: clip and offset the output image.
                    600: Option
                    601: .CI -o " file
                    602: specifies the output file name (standard output by default),
                    603: and
                    604: .CI -c " channels
                    605: specifies the output
                    606: .CW CHAN= .
                    607: .PP
                    608: The
                    609: .CW posit
                    610: and
                    611: .CW 3matte
                    612: commands combine images using the two- and three-dimensional compositing
                    613: operations described in |reference(porter duff compositing digital images)
                    614: and |reference(duff composite3d).
                    615: Each takes a list of picture file names as arguments, producing a composite
                    616: on standard output.  The
                    617: .CW -a
                    618: option will cause either program to output only the
                    619: .CW rgb
                    620: channels, suppressing
                    621: .CW a
                    622: (and
                    623: .CW z...
                    624: in the case of
                    625: .CW 3matte ).
                    626: .PP
                    627: There is an army of commands to read an image and, under the control of a few
                    628: parameters, write a modified image.  These include:
                    629: .TP "bwquantize \fIin out
                    630: File
                    631: .I in
                    632: contains a color image or a monochrome image with a colormap.
                    633: A gray-level image is written in
                    634: .I out ,
                    635: using the NTSC luminance formula.
                    636: .TP "clip \fIleft right in out
                    637: Clip an image horizontally to the limits
                    638: .I left
                    639: and
                    640: .I right .
                    641: A picture that does not fill out the limits is filled with black pixels.
                    642: .TP "xpand [-s] \fIin out [lo hi [inlo inhi]]
                    643: The input picture has its dynamic range adjusted so that pixels in the
                    644: range
                    645: .I inlo
                    646: to
                    647: inhi
                    648: are mapped to the range
                    649: .I lo
                    650: to
                    651: .I hi
                    652: (default 0 to 255).
                    653: The default values for
                    654: .I inlo
                    655: and
                    656: .I inhi
                    657: are determined per channel by examining the input picture.
                    658: The
                    659: .CW -s
                    660: option causes all channels to be examined together.
                    661: .I Lo ,
                    662: .I hi ,
                    663: .I inlo
                    664: and
                    665: .I inhi
                    666: may have any values whatsoever.  If
                    667: .I hi
                    668: is smaller than
                    669: .I lo ,
                    670: pixel values will be inverted, producing a negative image.
                    671: Any output pixel that would be mapped outside the range
                    672: 0\-255 is set to 0 or 255.
                    673: .TP "dither \fIin out
                    674: Convert a full-color (3 channel) picture to one channel with a color-map
                    675: by dithering.
                    676: .TP "floyd \fIin out
                    677: Convert an 8-bit gray-scale picture to one bit per pixel using a version of the Floyd-Steinberg
                    678: error-diffusion method.
                    679: .TP "halftone \fIscreen in out
                    680: Convert an 8-bit gray-scale picture to one bit using a given half-tone
                    681: .I screen .
                    682: The available screens are
                    683: .KS
                    684: .in 2n
                    685: .TS
                    686: lFCW   l.
                    687: ALLEBACH       Allebach's ordered-dither
                    688: BAYER  Standard ordered-dither
                    689: BLUENOISE      A pebble-screen pattern
                    690: CLASSIC        A 3-pixel-wide dot screen
                    691: CLASSIC2       Another 3-pixel-wide dot screen
                    692: CLASSIC3       A 4-pixel-wide dot screen
                    693: CLASSIC4       An 8-pixel-wide dot screen
                    694: DIAMOND        Rao and Arce's ordered-dither
                    695: LINE   Ulichney's line screen
                    696: RING   A concentric ring screen
                    697: TILT18 A tilted dot screen
                    698: .TE
                    699: .KE
                    700: .TP "he \fIin out
                    701: Histogram equalization: the intensity histogram
                    702: of the input image is measured.  The output image
                    703: has its contrast altered for maximum use of the
                    704: output range, equalizing the histogram
                    705: as much as possible.
                    706: .TP "hysteresis \fIlow high in out
                    707: Pixel values of the input picture below
                    708: .I low
                    709: are mapped to zero.
                    710: Those above
                    711: .I high
                    712: are mapped to 255.
                    713: If
                    714: .I low
                    715: and
                    716: .I high
                    717: are not equal, any region
                    718: below
                    719: .I high
                    720: that has any 8-connected neighbors below
                    721: .I low
                    722: is mapped to zero.
                    723: .TP "picaverage \fIweight in1 in2 out
                    724: The output picture is a weighted average of the two
                    725: input pictures.
                    726: .I Weight
                    727: determines the fraction of the average contributed by
                    728: .I in1 .
                    729: .TP "piccat \fTin1 ... out
                    730: The input pictures are concatenated one atop another.  The
                    731: output has the width of the widest input.
                    732: .TP "picjoin \fTin1 ... out
                    733: The input pictures are concatenated side by side.  The
                    734: output has the height of the highest input.
                    735: .TP "adapt \fIin out
                    736: Adaptive histogram equalization: each pixel of the output image
                    737: is the histogram-equalized value of the center of a 7\(mu7 pixel
                    738: window surrouding it in the input image.
                    739: .TP "ahe \fIin out
                    740: 17\(mu17 adaptive histogram equalization.  There should be an option to
                    741: .CW adapt
                    742: setting the window size.
                    743: .TP "clean \fIin out
                    744: Bayer-Powell noise removal filter.  If the center pixel of each 3\(mu3
                    745: window in the input differs from the average of the other 8 pixels by
                    746: more than 64, it is replaced by the periphery-average.  This has the
                    747: effect of flattening isolated noise pixels.
                    748: .TP "crispen \fIin out
                    749: 3\(mu3 linear crispening filter.  Convolves the input image with
                    750: the kernel
                    751: .P1
                    752: -1 -1 -1
                    753: -1  9 -1
                    754: -1 -1 -1
                    755: .P2
                    756: This is a mild high-pass filter.
                    757: .TP "edge \fIin out
                    758: 3\(mu3 linear edge-detection filter.
                    759: Convolves the input image with
                    760: the kernel
                    761: .P1
                    762: -1 -1 -1
                    763: -1  8 -1
                    764: -1 -1 -1
                    765: .P2
                    766: This is just the difference between the original image and the output of
                    767: .CW crispen .
                    768: .TP "edge2 \fIin out
                    769: 3\(mu3 non-linear edge-detection (Sobel operator) filter.
                    770: .TP "extremum \fIin out
                    771: 3\(mu3 extremum filter.  Replaces the center pixel of each
                    772: by the value in the 3\(mu3 window surrounding it that most
                    773: differs from it.
                    774: .TP "laplace \fIin out
                    775: 3\(mu3 "Laplacian filter.
                    776: Convolves the input image with
                    777: the kernel
                    778: .P1
                    779:  0 -1  0
                    780: -1  5 -1
                    781:  0 -1  0
                    782: .P2
                    783: This is a fairly extreme high-pass filter.
                    784: .TP "median \fIin out
                    785: 3\(mu3 median filter.  Each pixel is replaced by the
                    786: median of the 3\(mu3 window surrounding it.
                    787: .TP "smooth \fIin out
                    788: 3\(mu3 Bartlett filter.
                    789: Convolves the input image with
                    790: the kernel
                    791: .P1
                    792: 1/16 2/16 1/16
                    793: 2/16 4/16 2/16
                    794: 1/16 2/16 1/16
                    795: .P2
                    796: This is a moderately strong low-pass filter.
                    797: .TP "picreflect \fIin out
                    798: Reflect the input picture about its vertical center line.
                    799: .TP "quantize \fIin out
                    800: Convert a full-color picture to an 8-bit picture with colormap.
                    801: This does a much better job than
                    802: .CW dither .
                    803: It tries to pick an colormap that optimally clusters the input's
                    804: colors.
                    805: .TP "resample \fInpix in out
                    806: Resample the input image to be
                    807: .I npix
                    808: pixels wide.  The filter used in resampling minimizes both
                    809: pre- and post-aliasing.
                    810: .TP "transpose \fIinput output
                    811: Transpose the input picture.  This is useful in conjunction with
                    812: commands that operate on scan-lines, like
                    813: .CW resample
                    814: or
                    815: .CW clip ,
                    816: to perform operations on columns instead of rows.
                    817: .TP "shear \fIin out angle
                    818: Rotate the input image by the given
                    819: .I angle
                    820: (in degrees).  It's called
                    821: .I shear
                    822: because it operates by shearing the image 3 times
                    823: (horizontally, then vertically, then horizontally).
                    824: It fails for angles of 180\(de.
                    825: .TP "lx [-o\fIfile\fT] [-A\fIaspect\fT] [-a] [-s\fIscale\fT] [-r\fIrot\fT] [-x\fIxscale\fT] [-y\fIyscale\fT] \fIin\fT
                    826: Perform a linear transformation on the input image.
                    827: The
                    828: .CW -o
                    829: option specifies the output file name.  The default is standard output.
                    830: The
                    831: .CW -A
                    832: option specifies the aspect ratio of the pixels.  The default is 1.
                    833: The ITI frame-grabber produces images whose pixel aspect-ratio is 1.25.
                    834: The
                    835: .CW -a
                    836: option suppresses the writing of an alpha channel.  Normally
                    837: an alpha channel is computed even for input images that don't have one,
                    838: since the output picture is often rotated and thus doesn't completely
                    839: cover its window.
                    840: .IP
                    841: The transformation is specified by a sequence of options.  The specified
                    842: transformations are combined in the order given to yield a composite transformation.
                    843: The relevant options are:
                    844: .nf
                    845: .ta 8n
                    846: \fT-s\fIscale\fR       scale by \fIscale\fR.
                    847: \fT-r\fIrot\fR rotate by \fIrot\fR degrees clockwise.
                    848: \fT-x\fIxscale\fR      scale in x by \fIxscale\fR.
                    849: \fT-y\fIyscale\fR      scale in y by \fIyscale\fR.
                    850: .PP
                    851: There are several commands to generate images from
                    852: three-dimensional geometric descriptions of various sorts.
                    853: Most of these produce
                    854: .CW CHAN=rgbaz...
                    855: images that may be combined using
                    856: .CW 3matte .
                    857: In their output files, points at the near clipping plane will be mapped to
                    858: points having
                    859: .I z=0 ,
                    860: and points at the far clipping plane will have
                    861: .I z=1 .
                    862: .TP "ncpr [-a \fIaspect\fT] [-w \fIx0 y0 x1 y1\fT] [-c \fIrgbaz\fT] \fIinput\fT [\fIoutput\fT]
                    863: New Cheezy Polygon Renderer.
                    864: .I Output
                    865: (default standard output) is the name of the picture file that will contain the rendered
                    866: version of the scene described in
                    867: .I input ,
                    868: a text file specifying a polygonal scene.
                    869: The
                    870: .CW -a
                    871: option sets the pixel aspect-ratio (default 1.)
                    872: The
                    873: .CW -w
                    874: option sets the window of the output picture.
                    875: The
                    876: .CW -c
                    877: option specifies which channels should be written to the output picture.
                    878: .IP
                    879: The input file contains a sequence of single-letter commands, each with several
                    880: numeric parameters.  The commands are:
                    881: .IP
                    882: \fTv \fIfov near far ex ey ez lx ly lz ux uy uz\fR
                    883: .br
                    884: Set viewing parameters.
                    885: .I Fov
                    886: is the angle subtended vertically by the screen at the eye point.
                    887: Points whose distance from the eye is not between
                    888: .I near
                    889: and
                    890: .I far
                    891: will be clipped away before drawing.  However tempted, do not set
                    892: .I near
                    893: to zero, lest underflow or divide-check occur.
                    894: .I "(ex, ey, ez)
                    895: is the coordinate of the eye, the point from which the scene is viewed
                    896: and the center of perspective.
                    897: .I "(lx, ly, lz)
                    898: is a vector pointing from the eye toward the center of the scene.
                    899: The point
                    900: .I "(lx+ex, ly+ey, lz+ez)
                    901: is mapped into the center of the screen.
                    902: .I "(ux, uy, uz)
                    903: is the up vector, the direction of the zenith.  The point
                    904: .I "(lx+ux, ly+uy, lz+uz)
                    905: is mapped into a point somewhere above the center of the screen.
                    906: .IP
                    907: \fTl \fIx y z\fR
                    908: .br
                    909: Set the direction of the light source to
                    910: .I "(x, y, z) .
                    911: The light source is ``at infinity'' in the given direction.
                    912: .IP
                    913: \fTb \fIred green blue alpha\fR
                    914: Clear the screen to the given color.
                    915: .I Red ,
                    916: .I green ,
                    917: .I blue
                    918: and
                    919: .I alpha
                    920: should all be between 0 and 255.
                    921: .IP
                    922: \fTc \fIindex red green blue alpha\fR
                    923: Set a color table entry.  Indices into the color table are used
                    924: to specify the colors of polygons (see below.)
                    925: The table has 500 entries.  Unless reloaded by the
                    926: .CW c
                    927: command, the first 256 entries contain the 256 shades of gray,
                    928: the following 12 entries (256-267) are set to 12 logarithmically
                    929: spaced (perceptually equal) gray shades, and the next 20 entries
                    930: (268-287) to 20 logarithmically spaced gray shades.
                    931: .IP
                    932: \fTt \fIx0 y0 z0 x1 y1 z1 x2 y2 z2 c0 c1\fR
                    933: .br
                    934: Render a triangle with vertices
                    935: .I "(x0, y0, z0)" ,
                    936: .I "(x1, y1, z1)
                    937: and
                    938: .I "(x2, y2, z2)" .
                    939: On one side its color is
                    940: .I c0 ,
                    941: on the other it is
                    942: .I c1 .
                    943: If
                    944: .I c0
                    945: or
                    946: .I c1
                    947: is positive, the polygon's color is found in the corresponding color
                    948: table entry.  If negative, the color is found by modifying the color
                    949: table entry as though the surface were illuminated by a light source
                    950: whose direction was specified by the
                    951: .CW l
                    952: command.
                    953: .IP
                    954: \fTp \fIc0 c1 x0 y0 z0 x1 y1 z1 ... xn yn zn \fT;\fR
                    955: .br
                    956: Render a polygon whose color is
                    957: .I c0
                    958: on one side and
                    959: .I c1
                    960: on the other.
                    961: The polygon's vertices are
                    962: .I "(x0, y0, z0)" ,
                    963: .I "(x1, y1, z1)" ,...,
                    964: .I "(xn, yn, zn)" .
                    965: .in -8n
                    966: .TP "quad [-a] [-z] [-w \fIx0 y0 x1 y1\fP] \fIin out
                    967: .br
                    968: Compute an image of a quadric surface.  The
                    969: .CW -a
                    970: option suppresses writing out the alpha channel.
                    971: The
                    972: .CW -z
                    973: option suppresses writing out the z channel.
                    974: The
                    975: .CW -w
                    976: option specifies the output window.
                    977: The input file should contain 34 floating point numbers.
                    978: The first ten numbers are the upper triangle of the symmetric
                    979: matrix describing the quadratic form (in screen coordinates.)
                    980: The next 16 numbers are a matrix that converts screen-space
                    981: coordinates into world-space normals for illumination computations.
                    982: The next three numbers are the direction of the light source.
                    983: The next four numbers are the red, green, blue and alpha of the
                    984: surface's color.  The last number is the amount of ambient light
                    985: in the environment.
                    986: .TP "terrain \fIin out ex ey ez lx ly fov near far
                    987: Render a terrain image.
                    988: The input file
                    989: is a 2-channel picture file containing 16-bit elevation data on a regular grid.
                    990: .I "(ex, ey, ez)
                    991: is the eye position.
                    992: .I "(lx, ly, 0)
                    993: is a vector pointing from the eye to the center of the scene.
                    994: The up direction is
                    995: .I "(0,0,1)" .
                    996: .I Fov
                    997: is the vertical field-of-view angle.
                    998: .I Near
                    999: and
                   1000: .I far
                   1001: are the distances from the eye to the near and far clipping planes.
                   1002: .TP "bg \fIr0 g0 b0 r1 g1 b1 out
                   1003: Generate a background card whose color varies smoothly
                   1004: from
                   1005: .I "(r0, g0, b0)
                   1006: at the top to
                   1007: .I "(r1, g1, b1)
                   1008: at the top.
                   1009: Its z coordinate is set to 2, which is beyond the far clipping plane.
                   1010: .NH
                   1011: Animation
                   1012: .PP
                   1013: To use a command-based raster graphics system as described here to
                   1014: for animation requires writing command files to create and record
                   1015: long sequences of images.  Typical command files contain long sequences
                   1016: of repeated commands with slowly changing numeric parameters.  Several
                   1017: sequences starting and ending at different times may be interleaved
                   1018: to describe overlapping motion.  They are at best tedious and at worst
                   1019: tricky to generate by hand or using the usual tools.
                   1020: .PP
                   1021: .I Moto
                   1022: is a command generator tailored for an animator's needs.  Its input is
                   1023: a concise description of the animation to be performed; its output is
                   1024: a command file suitable for input to
                   1025: .I sh ,
                   1026: .I rc
                   1027: or some other command interpreter.
                   1028: Its arguments are an optional file name containing a
                   1029: .I moto
                   1030: program (default standard input) and list of numeric parameters
                   1031: that are made available to the program.
                   1032: .PP
                   1033: A
                   1034: .I moto
                   1035: program consists of a list of groups of commands.  Each block is
                   1036: guarded by a range of frames.  Here is an example:
                   1037: .P1
                   1038: 1,5:   pcp this %0
                   1039:        pcp %0 that
                   1040: .P2
                   1041: This generates
                   1042: .P1
                   1043: pcp this %0
                   1044: pcp %0 that
                   1045: pcp this %0
                   1046: pcp %0 that
                   1047: pcp this %0
                   1048: pcp %0 that
                   1049: pcp this %0
                   1050: pcp %0 that
                   1051: pcp this %0
                   1052: pcp %0 that
                   1053: .P2
                   1054: The command group is repeated for each of frames 1 to 5.
                   1055: .PP
                   1056: Groups may contain parameter ranges enclosed in brackets
                   1057: .CW [] :
                   1058: .P1
                   1059: 1,5:   pcp frame.[1,5] %0
                   1060:        echo snap|2500
                   1061: .P2
                   1062: This generates:
                   1063: .P1
                   1064: pcp frame.1 %0
                   1065: echo snap|2500
                   1066: pcp frame.2 %0
                   1067: echo snap|2500
                   1068: pcp frame.3 %0
                   1069: echo snap|2500
                   1070: pcp frame.4 %0
                   1071: echo snap|2500
                   1072: pcp frame.5 %0
                   1073: echo snap|2500
                   1074: .P2
                   1075: .PP
                   1076: Programs may have multiple groups, each guarded by
                   1077: a separate range of frames.  For each frame,
                   1078: .I moto
                   1079: checks each group and processes those
                   1080: whose guards include the current frame number.
                   1081: .PP
                   1082: Two special guards,
                   1083: .CW BEGIN
                   1084: and
                   1085: .CW END ,
                   1086: specify actions to be taken before an after processing frames:
                   1087: .P1
                   1088: BEGIN: clr
                   1089: 1,5:   pcp section[1,5] %0
                   1090: END:   pcp %0 composite
                   1091: .P2
                   1092: This generates
                   1093: .P1
                   1094: clr
                   1095: pcp section1 %0
                   1096: pcp section2 %0
                   1097: pcp section3 %0
                   1098: pcp section4 %0
                   1099: pcp section5 %0
                   1100: pcp %0 composite
                   1101: .P2
                   1102: .LP
                   1103: .I Moto
                   1104: allows complex computations inside parameter brackets:
                   1105: .P1 0
                   1106: 1,10:  clr [127.5*(1-cos([0,360]))]
                   1107: .P2
                   1108: This generates
                   1109: .P1
                   1110: clr 0
                   1111: clr 29.82933350233
                   1112: clr 105.35985734747
                   1113: clr 191.25
                   1114: clr 247.3108091502
                   1115: clr 247.3108091502
                   1116: clr 191.25
                   1117: clr 105.35985734747
                   1118: clr 29.82933350233
                   1119: clr 0
                   1120: .P2
                   1121: .PP
                   1122: Expressions may include constants and variables.
                   1123: All values are double-precision floating point numbers.
                   1124: The operators
                   1125: .CW = ,
                   1126: .CW / ,
                   1127: .CW + ,
                   1128: .CW -
                   1129: (both unary and binary),
                   1130: .CW < ,
                   1131: .CW > ,
                   1132: .CW <= ,
                   1133: .CW >= ,
                   1134: .CW == ,
                   1135: .CW != ,
                   1136: .CW "? :"
                   1137: and
                   1138: .CW ! ,
                   1139: all with their meanings as in C, except that all results
                   1140: are coerced to
                   1141: .CW double .
                   1142: The result of
                   1143: .CW a%b
                   1144: is
                   1145: .CW a-b*(int)(a/b) .
                   1146: The result of
                   1147: .CW "a && b
                   1148: is
                   1149: .CW "a?b:a .
                   1150: The result of
                   1151: .CW "a || b
                   1152: is
                   1153: .CW "a?a:b .
                   1154: The exponentiation operator is
                   1155: .CW ^ ,
                   1156: also written
                   1157: .CW ** .
                   1158: The expression
                   1159: .CW [a,b]
                   1160: variesfrom
                   1161: .CW a
                   1162: to
                   1163: .CW b ,
                   1164: linearly as the frame number varies between the guards of the
                   1165: group containing the expression.
                   1166: The expression
                   1167: .CW a[b,c]
                   1168: has the value
                   1169: .CW a*b+(1-a)*c .
                   1170: Its value varies from
                   1171: .CW b
                   1172: to
                   1173: .CW c
                   1174: as
                   1175: .CW a
                   1176: varies from 0 to 1.
                   1177: The expression
                   1178: .CW $i
                   1179: has the value of the
                   1180: .CW i 'th
                   1181: parameter following the file name on
                   1182: .I moto 's
                   1183: command line.
                   1184: .PP
                   1185: The precedence of operators is, from lowest to highest:
                   1186: .P1
                   1187: =
                   1188: ? :
                   1189: ||
                   1190: &&
                   1191: < <= == != > >=
                   1192: + -
                   1193: * / %
                   1194: [ ]
                   1195: ^ **
                   1196: - \fR(unary)\fP ! $
                   1197: .P2
                   1198: Expressions may be parenthesized to alter precedence.
                   1199: .PP
                   1200: The following math functions are available:
                   1201: .QS
                   1202: .ft CW
                   1203: fabs floor ceil sqrt hypot sin cos tan
                   1204: asin acos atan exp log log10 sinh cosh tanh
                   1205: gamma besj0 besj1 besjn besy0 besy1 besyn
                   1206: .ft R
                   1207: .QE
                   1208: All math functions are as described in the C library,
                   1209: except that angles are measured in degrees rather than
                   1210: radians for the trig and inverse trig functions.
                   1211: In addition
                   1212: .CW hypot
                   1213: may have two or three arguments,
                   1214: .CW atan
                   1215: may take two arguments instead of one,
                   1216: and may also be spelled
                   1217: .CW atan2 .
                   1218: .PP
                   1219: For parameterization, and to allow even more complex
                   1220: computations,
                   1221: .I moto
                   1222: has variables, assignment and computation groups.
                   1223: A computation group is distinguished from a command group
                   1224: by having a double colon separating its guard from the
                   1225: expressions to be computed:
                   1226: .P1 0
                   1227: BEGIN::        n=5
                   1228: 1,n::  x=512*sin([0,90])
                   1229: 1,n:   pcp -w 0 0 [x] 488 pic.[1,n] %0
                   1230: .P2
                   1231: This generates
                   1232: .P1 0
                   1233: pcp -w 0 0 0 488 pic.1 %0
                   1234: pcp -w 0 0 195.93391737093 488 pic.2 %0
                   1235: pcp -w 0 0 362.03867196751 488 pic.3 %0
                   1236: pcp -w 0 0 473.02632064578 488 pic.4 %0
                   1237: pcp -w 0 0 512 488 pic.5 %0
                   1238: .P2
                   1239: .PP
                   1240: Upon occasion it is useful to split
                   1241: .I moto 's
                   1242: output into several files, under program control.
                   1243: A group that is separated from its guards by an at-sign
                   1244: .CW @
                   1245: instead of a colon names a file into which
                   1246: subsequent output is to be written.  For example,
                   1247: .P1
                   1248: 1,5@   file.[1,5]
                   1249: 1,5:   This is file.[1,5].
                   1250: .P2
                   1251: creates 5 files, with names
                   1252: \fTfile.1\fR,...,\fTfile.5\fR.
                   1253: Each file's contents will announce its name.
                   1254: .PP
                   1255: As is true for all sufficiently large programs,
                   1256: .I moto
                   1257: has a shell escape.  A group separated from its
                   1258: guards by an exclamation point
                   1259: .CW !
                   1260: instead of a colon has its result text interpreted
                   1261: by a subshell.
                   1262: .PP
                   1263: Finally, Figure 1 shows an example taken from a real application.
                   1264: This
                   1265: .I moto
                   1266: program composites the frames of a short movie showing
                   1267: two flying saucers, flying in formation, chased by a third,
                   1268: racing over New Jersey.  The flying
                   1269: saucer images (files
                   1270: .CW run.*
                   1271: and
                   1272: .CW chase.* )
                   1273: and the background (file
                   1274: .CW bg )
                   1275: have been computed in advance.  In the composite, the
                   1276: .CW run.*
                   1277: images are re-used, staggered in time, to do the
                   1278: first two saucers.
                   1279: .1C
                   1280: .KF
                   1281: .P1
                   1282: BEGIN::         nchase=108
                   1283:         nrun=195
                   1284:         d1=12
                   1285:         d2=32
                   1286:         end=nrun+d2
                   1287:         chase=end-nchase+1
                   1288: 1,end: inputs=                         # empty the input list
                   1289: 1,nrun:        inputs="$inputs run.[1,nrun]"   # add the first saucer to the input list
                   1290: 1+d1,nrun+d1:
                   1291:        inp="$inputs run.[1,nrun]"      # add the second saucer
                   1292: chase,end:
                   1293:        inp="$inputs chase.[1,nchase]"  # add the chasing saucer
                   1294: 1,end:
                   1295:        3matte -a $inp bg frame.[1,end] # create the composite
                   1296: .P2
                   1297: .ce
                   1298: \fBFigure 1.\fP  Flying saucer script
                   1299: .KE
                   1300: .2C
                   1301: .NH
                   1302: References
                   1303: .PP
                   1304: |reference_placement

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.