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

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

unix.superglobalmegacorp.com

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