|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.