Postscript interpreter - user documentation =========================================== Post V1.7 Copyright Adrian Aylward 1989, 1992 Free use and non-commercial reproduction of the binaries of the interpreter library (post.library) is permitted, providing that the copyright notices are not removed. Distribution by disk libraries is permitted provided only a nominal copying fee is charged. Upload to commercial bulletin boards is also permitted, providing charges are only made for connect time, and there is no specific charge made for the file. You may freely copy, use and modify the user interface program (post). For queries and bug reports write to the author: Adrian Aylward, 20 Maidstone Road, SWINDON, Wiltshire. UK. No responsibilities accepted for bugs, but please let me know so I can fix them. Introduction ============ "Post" is a software based PostScript interpreter, presently running on the Amiga. The source code is written in C, and should be fairly portable to other machines. It supports the full Adobe language, with only minor variations. Prerequisites ============= Post uses the Arp library (V39+), primarily for its file requestor. For interactive working under WorkBench 1.3 you also need ConMan (V1.3+). Both these programs are widely available; any good BBS or PD/shareware library should have them. (ConMan is shareware.) You may well have them installed on your machine already. If you prefer not to install ConMan as your standard console handler, you will need to access it via an alternative device name, which you must specify by the CONDEV option. You will need at least a megabyte of memory, more for high density printer output. Command line interface ====================== usage: post [files...] [IFF file] [SCREEN] [PRINTER] [INTERACTIVE] [SIZE xyod..s..p.bc.] [MEM fhlv..] [CLOSEWB] [CONDEV con] If you forget, type "post ?" to display this. The input files --------------- The interpreter reads the input files in turn. When running interactively the input files are treated as startup files, and are rerun whenever the interpreter is restarted. So you would normally specify just the standard startup file "init.ps", or an alternative of your own. When running non-interactively you should in addition specify all the files you want to interpret, up to 5 in total; when the last is finished the interpreter will exit. The file "*" is treated specially, in that it is always considered interactive. So it is possible to run Post entirely within a CLI window and still get the interactive prompts. Printer output -------------- This is the default if neither the IFF nor SCREEN options are used, when running non-interactively. The output is sent to the printer device as a graphic dump. The interpreter will obtain default values for the page size, density, and number of colors from the current preferences. If you use the default sizes make sure you have set the page size: run preferences and on the graphic 2 screen set the width and height limits - either bounded or absolute or in pixels. The output defaults to black and white or 3 colour, according to the preferences. IFF file output --------------- This option will send the output to an IFF file. Each IFF file contains a single FORM ILBM. So that multiple pages may be created in a single run of the interpreter, sequence numbers are automatically generated: IFF path/fred*.pic will generate path/fred1.pic, path/fred2.pic ... and IFF path/fred??.pic will generate path/fred01.pic, path/fred02.pic ... The default page size etc. is the same as for screen output. SCREEN output ------------- This option will send the output to a window on the interactive screen. It implies interactive working. You can generate screen, printer and IFF output at the same time. However screen output has to use chip memory, and printer output at high resolution needs a large page buffer (about a megabyte for an A4 page at 300 dpi.). So if you attempt the two simultaneously you will probably run out of memory, unless your machine has 2 megabytes of chip ram. The default screen size is the same as the workbench screen, but in interlace mode. The default page size is A4, with a density of 75 pixels per inch. The default number of colours is 3. The page size is rounded up to the maximum size of the window. The INTERACTIVE option ---------------------- This option causes the interpreter to run interactively. A screen is opened and on it appears a requestor window for the parameters. If you click on OK two windows will be opened, one for console input and output, and the other to display the page buffer. Use the menus. The SIZE option --------------- The SIZE option sets the page size and density etc.. SIZE "x..y..s..xo..yo..[x]d..[y]d..p.bc." Up to 5 SIZE options are allowed; later values override earlier ones. The page sizes ("x..y..s..") are in pixels, as decimal numbers; "s" sets the size of the bands, for band rendering to the printer. The page offsets (xo..yo..) are in pixels, shifting the location of the bottom left of the bitmap relative to the PostScript logical page (origin at (0,0) in the initial user space). Densities ([x]d..[y]d..) are in pixels per inch; "xd" or "yd" set the x or y density, and "d" sets both. The printer density can be set by "p"; its value should be in the range 1 to 7. Printer output uses the Workbench printer device. If you wish to print to a LaserJet or DeskJet you should use the "postlj" program instead, as it gives better control over page size and runs faster. The number of colours is: "b" for black and white (1 bit plane), "c" or "c3" for 3 colour rgb (3 bit planes), and "c4" for 4 colour cmyk (4 bit planes). The MEM option -------------- The MEM option controls the amount of memory allocated for workspace. MEM "v..f..l..h.." Up to 5 MEM options are allowed; later values override earlier ones. Default Minimum ------- ------- f60000 1000 Font cache h20000 1000 Halftone cache v50000 5000 Virtual machine memory segment size l10000 1000 Line drawing workspace segment size In addition memory is allocated for the page buffer (one bit per pixel) and for drawing and imaging buffers. Since most of the workspace is allocated automatically you will not usually need to adjust these options. If your program is so large that you do need to increase any of these values, be aware that it is unlikely that it will run on any standard PostScript printer. The font cache is used to store character bitmaps; it saves recalculating them each time they are needed, so text rendering becomes many times faster. The default value is reasonable for average sized machines; if you are trying to shoehorn things into a small machine you could try reducing it. Or if you are printing a document using a large number of different characters, fonts, and sizes you may be able to improve performance by increasing it. The halftone cache holds halftone patterns used for simulating gray values. The default value will normally be satisfactory, but you might possibly need to increase it if you are using very large halftone patterns, for example for complex patterned fills. The virtual machine memory is automatically allocated in segments as they are needed, up to a maximum of 63. For most purposes you will not need to alter the segment size, but if you are running a gigantic program you might possibly need to increase it. The line drawing workspace holds the current path, together with all the paths saved by a gsave operation. It is automatically allocated in segments, up to a maximum of twenty. The default size is sufficient for about 4000 path elements, enough for all normal programs. The CLOSEWB option ------------------ If memory is tight, you can try using this option to close down WorkBench while Post is running. This only works if there are no application windows open on the WorkBench screen. The CONDEV option ----------------- The console handlers supplied with Workbench 1.3 did not have the capability of attaching a console to a window on a custom screen. So if you try to run Post interactively the console ouput will appear on the Workbench screen and screen output on its custom screen - which is not very convenient. So if you are running under 1.3 you should install the alternative (shareware) console handler called ConMan; you need version 1.3 or greater. If you have Workbench 2.0 this is built into the standard console handler, so there si no need to install ConMan. If you want to use a console handler installed using an alternative device name you can specify it using the CONDEV option. Default values for CONDV are CON:W (WorkBench 1.3) CON://///WINDOW (Workbench 2.0) Post will append to these strings the hexadecimal address of the interactive window, and use the resulting filename to open the console stream. Examples -------- To run postscript programs interactively, rendering to the screen: post init.ps screen To print a file with many big characters using a large font cache and increasing the path limit: post init.ps myfile.ps printer mem f500000l200000 To render a series of 640 * 512 pictures at 762 dpi. to iff files t:i01, t:i02 etc.: post init.ps mypics.ps iff t:i?? size x640y512d72 The WorkBench interface ======================= Just click on the icon. It always runs interactively. You can set up default arguments by setting the ToolTypes; add a string "ARGS=...." and it will be parsed just like the CLI startup. For example "ARGS=init.ps screen" will define the standard startup file and make the screen the default output. The Menus ========= Project Restart Takes you back to the parameters requestor, after which the interpreter is reinitialised. Quit Quit from the program File Load font Loads a file from the PSFonts: directory by default Load file Loads a file, without saving or restoring the VM Run file Runs a file, saving VM before and restoring after Interactive Interprets interactive input Control Pause every page Toggles pause every showpage/copypage Continue after pause Does just that Interrupt Sends a break; equivalent to CTRL/C Kill Generates an interrupt that cannot be trapped Before and after executing a file the operand stack is cleared. This is to prevent invalidrestore errors, particularly if interpretation ended in error with values on the stack. If you need to leave things on the stack you will have to run the files from a driver file, or from the interactive window. At the end of the file, (after any restore), the page is erased. If you use the automatic font loading, as defined in the standard startup file "init.ps", the font will be discarded when the VM is restored. To avoid repeated reloading of common fonts it may be better to use the "Load font" menu item to preload the ones you want. N.B. there is no check to stop you loading the same one twice; it will probably work but it will waste memory. Compatability ============= The interpreter is based upon the language (version "23.0") as described by the (red) book: "PostScript Language Reference Manual" Adobe Systems Incorporated, Addison-Wesley 1985, ISBN 0-201-10174-2 This is PostScript level 1, in Adobe terminology, as described in the first edition of the Red Book. In addition, the 4 colour operators from level 2 are also supported. Level 2 PostScript is defined in the second edition: "PostScript Language Reference Manual (second edition)" Adobe Systems Incorporated, Addison-Wesley 1990, ISBN 0-201-18127-4 File handling ------------- The files %stdin, %stdout, %stderr are permanently open as far as the operating system is concerned. Attempts to close them will invalidate the file object but not close them to the operating system. If they are connected to a terminal they will be unbuffered, so output will be transmitted immediately, without waiting for a "flush". The special files %statementedit and %lineedit are not supported. There is no end of file control character. Error handling -------------- All the standard Adobe error conditions are supported. There also some additional errors: The error "invalidstop" will be generated if a "stop" operator is executed not within any encolsing "stopped" context. The error "memoryallocation" will be executed if the interpreter is unable to obtain sufficient memory from the operating system. The error "kill" may be executed in response to an external command. It bypasses the error handler in errordict, so that it is always possible to kill a postscript program, even one that traps its own errors. The execution stack ------------------- The exact contents of the execution stack are not defined by the language reference manual, and cannot therefore be guaranteed to be the same as other implementations. Dumping the stack is likely to yield useful debugging information but is not recommended for normal programming. Colour mapping -------------- The interpreter can run with one bit plane (for black and white printers), 3 bit planes (red, green, blue) or 4 bit planes (cyan, magenta, yellow, black). For screen output 3 bit planes are appropiate. For a colour printer the 3 or 4 colour model can be used. The output is always in binary; gray scale is supported only via the halftone mechanism. For low resolution colour printers the 3 colour model is probably best. The 4 color model is for high resolution colour printers that can generate high frequency halftone screens, where a fourth screen is used to improve the quality of the blacks and grays. (N.B. the preferences printer drivers only handle 3 colour model, so if you want to use the 4 colour model you will probably need to generate an IFF file and write your own print dump program. They will however automatically use black the ribbon/ink if the printer has one) The transformations between the RGB and the HSB models are based on those in the book: "Procedural Elements for Computer Graphics" David F. Rogers, McGraw-Hill 1985, ISBN 0-E07-053534-5. Band Rendering -------------- For a high resolution printer the page buffer can be quite large (a megabyte or so). If you don't have enough memory to hold the entire page at once you can render each one in several bands. Set the "SIZE s..." option to the largest band size you have space for. (For matrix printers it will probably be best to make it a multiple of the number of printer pins times the number of vertically displaced passes). Then run the postscript program generating each page once for each band, using the "setband" operator, which is described below, to set the base for each band. Start at a base of zero and increment the base by the band size until you reach the page height. Each band is sent to the printer as a separate graphic dump; the last band generates a form feed to eject the page. You can use the "currentband" operator to calculate the number of bands needed: currentband 1 sub { setband pageproc } for 0 setband will execute "pageproc" once for each band (remaining) on the page. The procedure should execute copypage (or showpage) exactly once per iteration. This technique is only suitable for printer output. There is a special driver program "postband" that handles this automatically for programs that conform to the Adobe structuring conventions. Fonts ----- There are no fonts built in to the interpreter; they must all be downloaded. The findfont operator will execute the error invalidfont if the font you request is not present in the font dictionary. You can redefine it, perhaps to search the Unix/Amiga filing system to automatically download fonts or to substitute a default font. See the standard startup file. Both type 1 (Adobe encrypted format) and type 3 (standard PostScript as per the red book) fonts are now supported. In addition the IBM font format can be read directly. The font caching will work significantly better if all your fonts have UniqueID's. Then repeated makes of the same font with the same matrix will be cached, and cached character bitmaps can be retained even if the font is removed by a restore operation. N.B. if fonts are downloaded after a save they will be removed by the corresponding restore; in the interests of efficiency it may therefore be better to preload them. Other features -------------- Names of the form //name are looked up immediately by the scanner, and packed arrays have been implemented. These features were not on the original Adobe red book, but were added to the language specification later. When scanning the contents of a string, if there any embedded strings the escape sequences are interpreted just as they are in a file. This follows the specification of the more recent Adobe interpreters (including display PostScript) and not the original red book. Operators omitted or changed ---------------------------- banddevice Not appropiate for the Unix/Amiga environment. bytesavailable Since we can't tell how many bytes are available we always return -1. charpath Meets the level 2 spec. At the end of the string a moveto is appended to move to the correct origin for the next character. (So the current point is advanded by the width of the string.) copypage For printer output this works like the standard. The number of pages printed is equal to #copies. For screen output it does not need to do anything, as the screen is not buffered. For IFF file output it writes the page to the next file. echo Not appropiate for the Unix/Amiga environment. eexec This is implemented as per the Adobe type 1 fonts book. Its operand must be a file, which must match the object on top of the execution stack. It can be terminated only by a closefile (which terminates the eexec but does not actually close the file). So the sequences "currentfile eexec" and "currentfile closefile" as described in the book will work, but other combinations will likely fail. executive There is no executive, as the interpreter supports interactive usage directly. findfont Looks in the FontDirectory. If it can't find the supplied key, it executes the error invalidfont. flushfile We don't check for errors when flushing an input file, to prevent recursion in the error handler. framedevice Not appropiate for the Unix/Amiga environment. pathbbox Meets the level 2 spec. If the path ends with a moveto that is not the only element then it is ignored when calculating the bounding box. This means that the sequence "charpath pathbbox" will determine the bounds of the character(s), not including the empty space after the final character. See also "charpath". prompt Not called by the interpreter. See "prompts" instead. renderbands Not appropiate for the Unix/Amiga environment. resetfile Does nothing. showpage See the notes for copypage above. usertime Returns the time elapsed since the interpreter started, with a resolution of one second. Operators added --------------- currentband "currentband" base size height Returns the base of the current band, size of each band, and total height of the page. setband base "setband" Sets the base height of the band being rendered. The value must be greater than or equal to zero and less than the total height of the page. fontfile (filename) "fontfile" Opens a file for reading. If the first byte is hex "80" the file is assumed to be in IBM font format, and its contents are converted to standard ascii/binary as they are read. The standard input file (%stdin) is never in IBM font format. invalidstop (error) A "stop" has been executed for which there is no dynamically enclosing "stopped" context. prompts string string "prompts" The first string is used as the prompt when the interpreter is scanning terminal input and executing it immediately; the second string is used when execution is defered while scanning the contents of a procedure "{ ... }". No prompt is given when a newline is encountered within a string. vmhwm "vmhwm" hwmused maximum Returns two integers: the high water mark of the amount virtual memory used since the program was first started or the last "vmhwm", and the maximum available amount of memory. callextfunc result arg1 arg2 ... argc func "callextfunc" result Calls an external function using a C calling sequence. This operator is not available for use by ordinary PostScript programs; it can only be used when the library is called with an external function table supplied as an argument (see the library interface documentation for details). The "func" argument is the index of the function in the external call table, and "argc" is the number of parameters; both must be non-negative integers. The result is the object in which the result will be placed. If it a null then no result will be returned and the null object will be discarded; otherwise it must match the type of the result returned from the function. For both result and parameters bool and integer types will work OK; real types will work if your C compiler passes them just like ints (use ANSI prototypes so it does not expand them to double). For string parameters the address is passed. Arrays may be passed as parameters, but they are only useful if you know their PostScript object representation. The maximum number of parameters permitted is 20. Miscellaneous ------------- The system dictionary is left writeable so that standard preludes can add things to it - possibly removing write permission when they have finished. Similarly FontDirectory is writeable, so that it is possible to add entries without using definefont. Device space ------------ The largest device that the interpreter can handle is 30000 by 30000 pixels. In practice you will probably run out of memory long before reaching this limit. Known Bugs ========== If you close down WorkBench the menus sometimes get truncated and slightly corrupted. I suspect this is a Workbench/Intuition problem. If you type CTRL/C to abort if the printer is not ready then strange things may happen on subsequent attempts to print. N.B. if you run very low on memory, Intuition may behave strangely, and refuse to resize windows etc.. This is not a bug in Post. If you type CTRL/backslash in the interactive window you won't be able to run interactively again until a restart. Post tries to keep the console window active, so that all keyboard input goes there. It will probably be incompatible with mouse handlers that automatically activate the window under the cursor. Versions ======== V0.0 14-Nov-89 (prerelease) The original. V0.1 06-Dec-89 (prerelease) Image routines added. Range checks eased on gray levels and colours etc.. Area filling speeded up, matrix manipulation and colour mapping rewritten, numeric conditioning improved for path fill. Bugs fixed: syntax error, == string escapes, error handling and quit when recursing, vm error handling, integer overflow in path fill, matrix save, interrupt after printing page, dictionary second save, name table restore, boolean type checking, multiple halftone screens memory allocation. V0.2 07-Jan-90 (prerelease) Font and character routines added. Null device added. Band rendering of printer output added. Matrix manipulation rewritten again. Interpreter recursion rewritten. Allocate stacks dynamically. Bugs fixed: missing access checks on strings, scan token negative chars, depth check in path flattening, pathbbox, strings or null objects as dictionary keys, shade after grestore(all), fill/image with clip region, clip unclosed subpath, dictstack/execstack. V1.0 12-Feb-90 Support for big scrollable windows added. Menu handler added with port name option. Workbench startup added with parameters requestor window. Hex string scan optimised. Break now CTRL/C only, not CTRL/D. Bugs fixed: aspect ratio in iff file, clipping pictures much wider than the page. V1.1 27-Mar-90 Interpreter made into shared library. Message port interface removed. Band printing driver now included. Immediate lookup of //name added. Packed arrays added. CR and CRLF now converted to LF for readline and when scaning tokens from a file. Copypage now takes account of #copies. Bugs fixed: slow images where strings are not rectangles, attributes after copy and bind, charpath with fonts using gsave, iff run compression, setundercolorremoval now conforms to Adobe spec, make errorname literal, slow images repositioned by 1/2 pixel. V1.2 14-Oct-90 Allow multiple SIZE and MEM options. Page offset option added, page size defaults to A4, integer gadgets checked for +ve values. Type 1 fonts, IBM font format, encrypted files, eexec operator added. Bugs fixed: location zero not zero, printer device signals, proc arrays not executable, bind packed arrays, restore closing files, makefont matrices not commutative, makefont with translation, error handling during recursion, graphics state within buildchar proc, miterlimit less that sqrt(2), cvs copying too many bytes, solid lines after dashes, floating point error trap recursion (2620 version on 68882), check for fpu present, charpath with null character path, error handling loading file, invalid restore check, writehexstring. V1.3 27-Oct-90 LaserJet driver added. Interface fixes: Menus no longer ghost after startup file error and restart, pause status is now retained over a restart, printer preferences page size is now handled correctly, no longer crashes if arp.library is missing. Bugs fixed: IBM binary eexec sections beginning with white space, funny characters in error message command names, hints with stems of negative width, font character cache sizing, tune baseline alignment and flex, eexec lines ending in CR (not CRLF), aload packed arrays, zero length charstrings, font character cache hash chains. V1.4 22-Jan-91 External function call interface added. New flexible memory allocation for vm and paths; new error "memoryallocation". More flexible font cache limit. Interface fixes: Memory Fonts/Paths gadgets transposed, drag scroll bars under 2.0. Bugs fixed: writehexstring, zero height clipped paths, $error in userdict, undocumented charstring codes, halftone cacheing, mixed type 1 and 3 fonts. V1.5 01-Mar-91 Type 1 font character rendering improved (though slower). Fix printer page size selection (inches). Printer output now truncates to maximum dump size, to prevent scaling. Bugs fixed: path fill at top of clip path, free first vm segment, rotate scale and translate with matrix operands, cached characters within clip path, long clip paths, clippath not default clip path, hollow clip paths, setband. V1.6 19-Apr-91 Version defined as real number string in init.ps. Define ISOLatin1 encoding vector. New menu and error "kill". New error name string library entry. Pathbbox now meets level 2 spec. Allow Encoding length less than 256. Use .notdef for type 1 buildchar. Increase $error dictionary size; move $error to systemdict. Allow name operands to length operator. New operator cleardictstack. Change cvrs to correct spec. Bugs fixed: fast image positioning when ydir negative. V1.7 12-Mar-92 Post no treats "*" as interactive. New specification for CONDEV option, should work with Workbench 2.0. PostLJ new page size options and now works with DeskJet. Type 1 font rendering now interpolates between hints. Bugs fixed: Strings as dictionary keys, type 1 fonts etc. with white space after eexec, arcs of zero radius, stroking lines of zero length, roll of zero items, image and kshow procs with strange stack discipline, setflat values out of range.