home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / printer / hwgpost / hwgpostlib.doc < prev    next >
Text File  |  1995-02-27  |  21KB  |  502 lines

  1. PostScript shared library interface (post.library, with HWGPOST >= V22.21)
  2. ==========================================================================
  3.  
  4. HWGPOST, Copyright 1993, 1994 Heinz Wrobel, is mostly calling compatible to
  5. Post V1.7, Copyright Adrian Aylward 1991, 1992. But it is a very different
  6. beast inside.
  7.  
  8. This document is derived from Adrian Aylward's post.library documentation.
  9.  
  10.  
  11.  
  12. Introduction
  13. ============
  14.  
  15. The file "post.library" is an AmigaOS Exec shared library containing a
  16. mostly Level II compliant PostScript interpreter.  It is designed to be
  17. shareable between different processes, supporting arbitrarily many
  18. PostScript activations - at least until you run out of memory.
  19.  
  20. This file should be read in conjunction with the header file "postlib.h".
  21.  
  22. The standard user interface source files are distributed with old Post 1.7.
  23. Read them as examples for now. If there is different information in this
  24. document or the current headerfile postlib.h or init.ps, the
  25. current information holds.
  26.  
  27.  
  28. Activation Records
  29. ==================
  30.  
  31. Simultaneous multiple activations of PostScript are allowed.  Before using
  32. post.library you must first open it by a call to OpenLibrary().  To create
  33. an activation you then call PScreateact() which returns a pointer to the
  34. activation record.  You can then make calls to the interpreter library,
  35. passing the activation record pointer as an argument.  You can create
  36. several activations, possibly from different processes and intermingle
  37. the interpreter calls if you wish. But you CANNOT PASS ACTIVATION RECORDS
  38. BETWEEN PROCESSES! When you have finished with an activation, call
  39. PSdeleteact() to delete it and free the memory it used. When you have
  40. finished with the library call CloseLibrary(); if no other processes have it
  41. open, then Exec can remove it from memory if the space is needed.  (N.B. if
  42. the space is not needed, the library will remain in memory in case it is
  43. opened again.)
  44.  
  45. N.B. the library can only be called from a process, as it calls various
  46. AmigaDOS functions.  IT IS NOT PERMISSIBLE TO PASS ACTIVATION RECORDS
  47. BETWEEN PROCESSES! NOTE THIS WELL!
  48.  
  49.  
  50. The Parameter Block
  51. ===================
  52.  
  53. The parameter block is the argument to PScreateact().  It is specifies the
  54. addresses of the bitmap planes, size of the page, and the amount of memory
  55. to be allocated for the activation etc ...  Its format is defined in detail
  56. in the header file postlib.h.
  57.  
  58. N.B. all ints are 32 bits, shorts are 16 bits.
  59.  
  60. The page size is limited to 30000 pixels a side.  The densities (pixels per
  61. inch) may be any strictly positive integer value.  The y direction may be
  62. set to +1 - if the bitmap rows are in PostScript order (bottom row first)
  63. or -1 - Amiga order (top row first).
  64.  
  65.     page.buf[24]        Bitplane pointers, up to 24
  66.     page.len            Size in bytes of each plane
  67.     page.depth          Number plane pointers to use
  68.     page.flags          Special device options
  69.     page.bitspercolor   How many plane pointers to be used per gun.
  70.     page.PSextdevice    An optional extension to the device information
  71.     page.xbytes         Number of bytes in each row
  72.     page.xsize          Number of pixels in each row
  73.     page.ysize          Number of rows
  74.     page.ybase          Base of current band
  75.     page.yheight        Total height of full page, for band rendering
  76.     page.xden           X density
  77.     page.yden           Y density
  78.     page.ydir           Y direction
  79.  
  80. To specify how many bitplanes are used per color, you set "bitspercolor" to
  81. the appropriate value. If this value is not set, one bitplane per color is
  82. assumed and only 1, 3, and 4 are permissible as depth in this case.
  83. Example: RGB 3:3:2 => depth=8, bitspercolor=3.
  84.  
  85. Note that bitspercolor should not exceed 8.
  86.  
  87. For special use, the page device description can be enhanced by setting
  88. page.PSextdevice. The PSextdevice structure contains the following fields.
  89.  
  90.     flags               Extension of the main flags field.
  91.  
  92.     maskbuf             If set, must be a plane as in page.buf. For any
  93.                         rendering you'll get bits set in this mask plane.
  94.                         This gives you a mask of the actually used places
  95.                         in the buffer. The mask might be useful for
  96.                         BltMaskBitMapRastPort() or some such. erasepage
  97.                         will clear this mask plane.
  98.  
  99.     Kbuf[8]             Eight additional plane pointers to allow for true
  100.                         eight bit CMYK rendering. You need to set the depth
  101.                         to a value greater 24 for these to be used.
  102.  
  103. The length of these structures is subject to change. Always set unused fields
  104. to zero.
  105.  
  106. As a starting point for memory sizes try the values following.  (These are
  107. defined in the header file.)  For normal PostScript programs the defaults
  108. are perfectly satisfactory.  If you specify a value of zero the default
  109. will be used instead; values less than the minimum will be increased.
  110.  
  111.     memvlen     50000   VM
  112.     memflen     60000   Font cache
  113.     memllen     15000   Path lines
  114.     memhlen     20000   Halftones
  115.     memplen     60000   Pattern cache
  116.  
  117. The user data pointer is intended to be used to identify multiple
  118. activations.  You can set it to any value you like.  The function pointers
  119. are described below.
  120.  
  121.     userdata            User data pointer
  122.     flushfunc           Flush page function pointer
  123.     copyfunc            Copy page function pointer
  124.  
  125. The standard input and output streams are the AmigaDOS file handles to be
  126. used by the interpreter for %stdin, %stdout, %stderr.  Also the standard
  127. output is used for prompts and the error output for error messages. These
  128. file handles will not be closed by the interpreter even though PostScript
  129. file objects referring to them may be closed.
  130.  
  131.     infh                Standard Input file handle
  132.     outfh               Standard Output file handle
  133.     errfh               Standard Error file handle
  134.  
  135. These are for backwards compatibility with the infamous "callextfunc"
  136. operator. You'll find details below.
  137.  
  138.     funcmax             Number of external functions
  139.     functab             Pointer to external function table, or zero
  140.  
  141. Anything else in the block is reserved and must be set to zero.
  142.  
  143. Notes on the special device flags
  144. ---------------------------------
  145.  
  146. In the header file "postlib.h" you will find some flag definitions for the
  147. main flag field of the parameter page. They need more explanation.
  148.  
  149.     HWGPOST_DEVx_NOSHADE
  150.  
  151.         Halftoning is in effect suppressed. No halftone screens will be
  152.         used. Any color intensity that would cause shading will be rendered
  153.         as the next lower color value truly representable within the
  154.         bitplanes would. Shading is simply "cut out".
  155.  
  156.     HWGPOST_DEVx_CMYK
  157.  
  158.         Old post.library supported the CMYK color space and operators. When
  159.         converting any colors to values passed to the transfer functions,
  160.         it creates RGBW values, though, instead of CMYK. With this flag
  161.         set, the colorspace mapping algorithm will stay with CMYK and CMYK
  162.         will be passed to the transfer functions if applicable.
  163.  
  164.     HWGPOST_DEVx_INVERTOUTPUT
  165.  
  166.         The output of the transfer functions represent the value that
  167.         should be rendered into the bitplanes. With this flag set,
  168.         these values in the range [0.0;1.0] will effectively reversed with
  169.         a simple "shade = 1.0 - shade" before the rendering is set up. This
  170.         is the easiest way to create "negative" output and might come in
  171.         handy for multiple bitplane color handling, where black should be
  172.         "all bits 0" instead of "all bits 1" in the planes.
  173.  
  174.  
  175. Function Pointers
  176. =================
  177.  
  178. There are two function pointers within the parameter block, which are used
  179. when the interpreter needs to call routines supplied by its client. If the
  180. pointers are zero, the calls are skipped.
  181.  
  182. To help identify calls from multiple activations, the activation record
  183. address is also passed in A0 and the userdata pointer in A1.
  184.  
  185.       flushfunc(D0: int y1, D1: int y2)
  186.  
  187. Flush the bitmap to the screen.  The interpreter calls this function after
  188. a painting operation has updated the bitmap.  Then if the output is being
  189. viewed interactively the client can update the screen or window.  The
  190. arguments are the range of bitmap rows (y1 ... y2-1) that may have been
  191. updated.
  192.  
  193.       copyfunc(D0: int num)
  194.  
  195. Copy the page to the output device.  The argument is the value of
  196. "#copies", which should be taken into account if the output is to a
  197. printer, but is not meaningful for screen output.
  198.  
  199.  
  200. Calling External Functions
  201. ==========================
  202.  
  203. The original "callextfunc" operator of post.library <= V1.7 is no longer
  204. supported even though it is still available in disguise as "@callextfunc".
  205. Use of this operator is strongly discouraged as it might lure you into
  206. making assumptions about internal HWGPOST data representations.
  207.  
  208. A more general way to call external functions has been devised via the new
  209. "@calluserhook" operator. This operator collects the arguments, passes them
  210. to a "Hook" as defined by the utility.library, records any changes and
  211. returns the result. This is the calling sequence:
  212.  
  213.     mark <args..> <userhookadr> <msgadr> @calluserhook
  214.  
  215. On return the operand stack will look like this:
  216.  
  217.     mark <args..> <resint>
  218.  
  219. A number from zero to eight arguments is supported. Only certain PostScript
  220. objects may be passed as arguments: integers, reals, and booleans are
  221. passed as the 32 bit bitpatterns corresponding to their values; strings are
  222. passed as the 32 bit address of their contents with the length as the
  223. following 32 bit integer. (N.B. PostScript strings are terminated by
  224. length; there is no terminating null unless the program puts one there. The
  225. user function may not go beyond the string length!)
  226.  
  227. <hookadr> and <msgadr> are integers that are used as 32 bit memory address.
  228. If no <msgadr> is needed, just use 0. These addresses should be passed to
  229. the interpreter via the PSintstring() function in full PostScript notation
  230. like "/hookadr 16#780ab44 def" to be used by special PostScript code. It is
  231. advisable to put them into special, private dictionaries.
  232.  
  233. The argument values passed are put into an array of 32 bit values which is
  234. passed as "objectptr" to the Hook. The return value will be put on the
  235. operand stack as <resint> and any changes to numeric values in the 32 bit
  236. array will be put back into the args on the operand stack. The Hook may
  237. change string contents within the address and length passed to it.
  238.  
  239. As an example assume this calling sequence:
  240.  
  241.     mark 1 string1 2.5 4 string2 false hookadr 0 @calluserhook
  242.  
  243. The 32 bit array passed to the hook as object will have these contents:
  244.  
  245.     array[0]:   32 int 1
  246.     array[1]:   string1: address
  247.     array[2]:   string1: length
  248.     array[3]:   IEEE float 2.5
  249.     array[4]:   32 int 4
  250.     array[5]:   string2: address
  251.     array[6]:   string2: length
  252.     array[7]:   0
  253.  
  254. If the hook function changes array[0] to 3, array[7] to 1, and returns -1,
  255. the resulting operand stack will contain these values:
  256.  
  257.     mark 3 string1 2.5 4 string2 true -1
  258.  
  259. Changing a string address or length should not be tried. If results are not
  260. needed, a cleartomark will get rid of them easily.
  261.  
  262. There should not be any assumptions made about internal representation of
  263. objects. For booleans, only 0 and 1 should be used.
  264.  
  265. N.B. PSintstring() is not guaranteed to work recursively. So calling it
  266. from the hook is not a good idea. The Hook is called on the interpreters
  267. context. If a local near data section is needed, the Hook function is
  268. responsible for setting up A4, e.g. from hook->h_Data. Standard rules for
  269. saving registers apply. Do not assume that A4 contains anything useful!
  270.  
  271.  
  272. Calling External Functions with @callextfunc
  273. ============================================
  274.  
  275. The original "callextfunc" operator of post.library <= V1.7 is no longer
  276. supported even though it is still available in disguise as "@callextfunc".
  277. Use of this operator is strongly discouraged as it might lure you into
  278. making assumptions about internal HWGPOST data representations. It is only
  279. here for limited backwards compatibility. Do not use it for new SW!
  280.  
  281. If you supply an external function table your PostScript program can call
  282. the functions within it by the "@callextfunc" operator.  The contents of
  283. the table are the addresses of the function entry points.  The functions
  284. must have standard (Lattice, non-registerised) C compatible calling
  285. sequences. They must not assume any useful value in register A4 on entry,
  286. and must preserve A4 and the other C registers on exit.
  287.  
  288. Unlike with post.library <= 1.7 there is additional information given,
  289. though. To help identify calls from multiple activations, the activation
  290. record address is also passed in A0 and the userdata pointer in A1.
  291.  
  292. Only certain PostScript objects may be passed as arguments: integers reals
  293. and booleans are passed as the 32 bit bitpatterns corresponding to their
  294. values; arrays and strings are passed as the 32 bit address of their
  295. contents - if the length is required it must be passed separately.  (N.B.
  296. PostScript strings are terminated by length; there is no terminating null
  297. unless the program puts one there.)
  298.  
  299. It is theoretically possible to pass arbitrary objects by including them
  300. within an array, but then you would need to know their PostScript
  301. representation. As the representation has been changed thoroughly for
  302. HWGPOST and will continue to change in the future, this "feature" is of no
  303. use at all!
  304.  
  305. The "@callextfunc" operator is only inserted into the system dictionary if
  306. a function table is present.  So you will not find it if you attempt to
  307. execute it from the standard user interface.
  308.  
  309.  
  310. Library Entry points
  311. ====================
  312.  
  313. Prototypes and pragmas for the entry points are defined in the header file.
  314.  
  315.  
  316.   Create a PostScript activation
  317.   ------------------------------
  318.  
  319.           D0:int arec = PScreateact(A1:struct PSparm *parm)
  320.  
  321. The result is the address of the new activation record.  If the activation
  322. fails an error code is returned instead - zero if the interpreter failed
  323. to start at all because there was insufficient free memory, or an
  324. interpreter error code if there was an error during initialisation.
  325. Otherwise the result is the address of the activation record.  The result
  326. is always returned as an int.  If is is greater than errmax then the
  327. activation was successful, and the value is an address; otherwise the
  328. activation failed, and the result is zero or an error code.
  329.  
  330.  
  331.   Delete a PostScript activation
  332.   ------------------------------
  333.  
  334.           VOID PSdeleteact(A0:APTR arec)
  335.  
  336. The activation record is deleted and the associated memory is freed.
  337.  
  338.  
  339.   Interpret a string or file
  340.   --------------------------
  341.  
  342.           D0:int errnum = PSintstring(A0:APTR arec, A1:char *string,
  343.                                       D0:int length, D1:int flags)
  344.  
  345.  
  346.   Flag bits:
  347.  
  348.     PSFLAGSTRING, PSFLAGGFILE
  349.  
  350.         If PSFLAGSTRING is set, the contents of the string are interpreted
  351.         as PostScript source.  If the flag PSFLAGFILE is set, the string is
  352.         a file name, whose contents are interpreted.  If neither of these
  353.         flag bits are set the string is ignored, but the other flag bits
  354.         still have their effects; if both are set the result is undefined.
  355.  
  356.  
  357.     PSFLAGINTER
  358.  
  359.         If PSFLAGINTER is set (when interpreting a file), the file is
  360.         considered to be interactive.  The banner is printed, and the
  361.         interpreter prompts for each line of input from the file.
  362.  
  363.  
  364.     PSFLAGCLEAR
  365.  
  366.         If PSFLAGCLEAR is set, then after interpretation the operand stack
  367.         is cleared and the dictionary stack is popped until only the system
  368.         and user dictionaries remain. The execution stack is emptied, too.
  369.  
  370.  
  371.     PSFLAGSAVE
  372.  
  373.         If PSFLAGSAVE is set, job server behaviour is set up for the
  374.         current job only. It is functionally equivalent to
  375.         (PSFLAGSTARTJOBSERVER| PSFLAGENDJOBSERVER) but you shouldn't use
  376.         the job server flags instead if you really want PSFLAGSAVE.
  377.  
  378.  
  379.     PSFLAGERASE
  380.  
  381.         If PSFLAGERASE is set, then the page is erased.  This happens right
  382.         at the end, after any vm restore, so the page is erased taking into
  383.         account the restored transfer function(s).
  384.  
  385.     PSFLAGSTARTJOBSERVER, PSFLAGENDJOBSERVER
  386.  
  387.         With PSFLAGSTARTJOBSERVER and PSFLAGENDJOBSERVER one can create one
  388.         job server run, spanning multiple invocations of PSintstring(). The
  389.         former forces a successful startjob with a "false" operand before
  390.         running the job, the latter forces a successful startjob with a
  391.         "true" operand after running the job and clears out the execution
  392.         stack and does some other private things. These flags do not nest.
  393.         If you think about using them in a tricky way: Think again and ask
  394.         _first_.
  395.  
  396. This routine is NOT guaranteed to recurse correctly; strange things or
  397. crashes may happen if you try to call it from an external function called
  398. from the same activation.
  399.  
  400.  
  401.   Signal an interrupt
  402.   -------------------
  403.  
  404.           VOID PSsignalint(A0:APTR arec, D0:int flag)
  405.  
  406. This routine may be called to set an interrupt signal flag to notify the
  407. interpreter of a special condition. The possible flag values are defined in
  408. the header file postlib.h. You may or multiple bit flags together. The
  409. interpreter tests these flags at the head of its main loop, and also within
  410. certain potentially length operators (=, ==, stack and pstack). If a flag
  411. is set it the interpreter will take appropriate action immediately and
  412. automatically clear the corresponding flag bit. You may safely call this
  413. routine at any time during the life of the activation. It is intended to be
  414. called from within your task's exception handler, if the CTRL-C break
  415. signal is set. Unlike with post.library <= V1.7 it is not possible to clear
  416. a flag once it has been set by calling this function. Only the interpreter
  417. will clear a flag bit when it is handled.
  418.  
  419.  
  420.   Signal a floating point error
  421.   -----------------------------
  422.  
  423.           VOID PSsignalfpe(A0:APTR arec)
  424.  
  425. This routine is intended to be called whenever a floating point trap is
  426. generated by the interpreter.  It generates an immediate undefinedresult
  427. error.  You must not call it at any other time; if you do you will crash
  428. the machine.  It is only useful if you are using the version of the library
  429. compiled for the 68881 FPU or compatible chips.  (The software floating
  430. point routines do not generate traps).  Before calling the library you
  431. should set up a trap handler and set the bits in the fpcr register to
  432. enable the traps.  (If you do not set up the traps, the FPU will substitute
  433. the special value not-a-number for the result and continue.  The
  434. undefinedresult error will not be triggered, and results of your program
  435. may be incorrect.)  If you application does not use the FPU you can simply
  436. direct all traps to the library, otherwise it is essential that you
  437. ensure that you only call this routine if the trap derived from the library
  438. and not your own code.
  439.  
  440.  
  441.   Error
  442.   -----
  443.  
  444.           VOID PSerror(A0:APTR arec, D0:int errnum)
  445.  
  446. This routine is intended to be called from within your own flush or copy
  447. page functions, to signal that an error ocurred.  You can also call it from
  448. an external function.  You must not call it at any other time; if you do, you
  449. will crash the machine.  It calls the PostScript error handler and never
  450. returns.  The values for the error number are defined in the header file.
  451.  
  452.  
  453.   Return a text string corresponding to an error name
  454.   ---------------------------------------------------
  455.  
  456.           D0:const char *str = PSerrstr(A0:int arec, D0:int errnum)
  457.  
  458. Converts a postscript error number to a text string.  Returns NULL if the
  459. number is out of range.
  460.  
  461.  
  462.   Change device page
  463.   ------------------
  464.  
  465.           VOID PSsetdevice(A0:APTR arec, A1:struct PSdevice *page)
  466.  
  467. Note: While "setpagedevice" is not currently available, the effects caused
  468.       by PSsetdevice() are _very_ likely to change in many ways when the
  469.       time comes. If you feel that you rely on effects other than simply
  470.       replacing the device page buffer and dimensions CONTACT ME NOW.
  471.  
  472. Changes the device page buffer and dimensions.  If the clip path is still
  473. set to its initial value (the whole page) it is changed to match the new page
  474. size; otherwise it is unchanged (and may therefore possibly exceed the new
  475. page size).  All the clip paths saved on the graphics stack are similarly
  476. changed.  The CTM at the topmost saved graphics state (the one returned to
  477. by a "grestoreall" when there are no active VM saves) is reset to match the
  478. new page size and density.  Otherwise the CTM is not affected; you will
  479. likely want to execute "initmatrix" afterwards.
  480.  
  481. The interactions of this routine with the stack of saved graphics states are
  482. complex, leading to unexpected behaviour unless you understand exactly what
  483. is happening.  So it is safest to think twice about calling it and always
  484. call it when there are no save's or gsave's active, and then to reinitialise
  485. the CTM immediately.
  486.  
  487. This routine should not be called from within a character build, kerning,
  488. or imaging procedure.
  489.  
  490.  
  491. Problems, Comments, and Bugs
  492. ============================
  493.  
  494. You will find my complete address in the header file "postlib.h". Contact
  495. me if you have any questions or suggestions. Don't rely on empirical
  496. programming.
  497.  
  498. Heinz Wrobel
  499. <heinz@hwg.muc.de>
  500.  
  501. *** EOT ***
  502.